加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java – 将图像转换为黑白 – 失败,颜色鲜艳

发布时间:2020-12-15 02:57:39 所属栏目:Java 来源:网络整理
导读:我试图将图像转换为仅黑白(不是灰度). 我用过这个: BufferedImage blackAndWhiteImage = new BufferedImage( dWidth.intValue(),dHeight.intValue(),BufferedImage.TYPE_BYTE_BINARY);Graphics2D graphics = blackAndWhiteImage.createGraphics();graphics.
我试图将图像转换为仅黑白(不是灰度).

我用过这个:

BufferedImage blackAndWhiteImage = new BufferedImage(
        dWidth.intValue(),dHeight.intValue(),BufferedImage.TYPE_BYTE_BINARY);
Graphics2D graphics = blackAndWhiteImage.createGraphics();
graphics.drawImage(colourImage,null);

return blackAndWhiteImage;

一切都很好,直到我决定尝试更亮的颜色,例如Google徽标:

它出来了:

然后我首先尝试通过槽灰度使用:

BufferedImage blackAndWhiteImage2 = new BufferedImage(
        dWidth.intValue(),BufferedImage.TYPE_USHORT_GRAY);

并且它似乎保存了蓝色,但不是最亮的(在这种情况下是黄色),并且您可能会看到它的质量下降:

任何建议都非常感谢;我相信我所追求的是将每种颜色转换为黑色,除了白色(这将是背景颜色),这已经在应用TYPE_BYTE_BINARY去除alpha通道时完成.

编辑:
也许我没有解释清楚:

>最终图像必须具有白色背景** 1
>其他每种颜色都必须转换为黑色

** 1 – 在某些情况下,图像实际上是白色的黑色…这很烦人(whiteOnBlackExample),因为它使这个过程变得很复杂,我将在稍后留下,因为现在优先考虑转换“正常”图像.

我做的是,首先删除alpha通道(如果存在) – >因此将alpha通道转换为白色;然后将每个其他颜色转换为黑色

解决方法

如果使用JavaFX,则可以使用亮度为-1(最小值)的 ColorAdjust效果,这会使所有(非白色)颜色变为黑色:
public class Main extends Application {

    Image image = new Image("https://i.stack.imgur.com/UPmqE.png");

    @Override
    public void start(Stage primaryStage) {
        ImageView colorView = new ImageView(image);
        ImageView bhView = new ImageView(image);

        ColorAdjust colorAdjust = new ColorAdjust();
        colorAdjust.setBrightness(-1);
        bhView.setEffect(colorAdjust);

        primaryStage.setScene(new Scene(new VBox(colorView,bhView)));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这些Effect经过优化,因此可能比手动应用它们更快.

编辑

既然你的要求是那样的话

>任何不透明的像素都应转换为白色,和
>任何非白色的像素都应该变成黑色,

据我所知,预先设计的效果不适合你 – 它们太具体了.你可以逐像素操作:

WritableImage writableImage = new WritableImage(image.getPixelReader(),(int) image.getWidth(),(int) image.getHeight());
PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = writableImage.getPixelReader();
for (int i = 0; i < writableImage.getHeight(); i++) {
    for (int j = 0; j < writableImage.getWidth(); j++) {
        Color c = pixelReader.getColor(j,i);
        if (c.getOpacity() < 1) {
            pixelWriter.setColor(j,i,Color.WHITE);
        }
        if (c.getRed() > 0 || c.getGreen() > 0 || c.getBlue() > 0) {
            pixelWriter.setColor(j,Color.BLACK);
        }
    }
}
ImageView imageView = new ImageView(writableImage);

请注意,您应用规则的顺序很重要.如果应用1然后应用2,则透明的非白色像素将变为白色,但如果应用2然后再应用1,则它将变为黑色.这是因为预定义的WHITE和BLACK颜色是不透明的.您可以手动设置红色,绿色和蓝色值,而不是更改Alpha值.这一切都取决于您的确切要求.

请记住,由于某些文件格式的有损压缩,您可能根本找不到真正的白色,但是接近真正白色的值,您的眼睛将无法区分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读