【问题标题】:Convert color image into black and white using java created from scratch使用从头开始创建的 java 将彩色图像转换为黑白
【发布时间】:2016-12-09 06:42:39
【问题描述】:

我想将我的图片从彩色转换为黑白,这似乎是从头开始创建的。 这是我在不同帖子中描述的代码:

    BufferedImage bi = ImageIO.read(new File("/Users/***/Documents/Photograph.jpg"));
    ColorConvertOp op = 
        new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
    ImageIO.write(bi, "PNG", new File("/Users/bng/Documents/rendered2.png"));
    op.filter(bi, bi);

但我的图像仍然没有转换为黑白。此外,此代码将 render2.png 图像大小增加到 10 倍。 另外,如果我能找到一些 Java 8 的方法来做到这一点,那就太好了。 有什么建议吗?

【问题讨论】:

  • 我会更具体地说明您想要的结果。黑白图像只有两种颜色,也称为二值图像。灰度图像(您尝试使用 ColorSpace.CS_GRAY 创建)的颜色多于两种

标签: java image-processing java-8 bufferedimage graphics2d


【解决方案1】:

这是对我有用的代码:

    BufferedImage input = ImageIO.read(new File("/Users/bng/Documents/Photograph.jpg"));
    // Create a black-and-white image of the same size.
    BufferedImage im = new BufferedImage(input.getWidth(), input.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
    // Get the graphics context for the black-and-white image.
    Graphics2D g2d = im.createGraphics();
    // Render the input image on it.
    g2d.drawImage(input, 0, 0, null);
    // Store the resulting image using the PNG format.
    ImageIO.write(im, "PNG", new File("/Users/bng/Documents/rendered.png"));

BufferedImage.TYPE_BYTE_BINARY 为我提供了准确的解决方案。 Lokking for Java 8 版本的上述代码。

【讨论】:

  • 如何创建灰度(黑/白)图像?
  • 它是 TYPE_BYTE_BINARY,它给出了指定的黑白颜色 "nt java.awt.image.BufferedImage.TYPE_BYTE_BINARY = 12 [0xc] 表示不透明的字节压缩 1、2 或 4 位图像. 图像有一个不带 alpha 的 IndexColorModel。当此类型用作接受 imageType 参数但没有 ColorModel 参数的 BufferedImage 构造函数的 imageType 参数时,将使用默认 sRGB ColorSpace 中的两种颜色的 IndexColorModel 创建一个 1 位图像: {0, 0, 0} 和 {255, 255, 255}。”
【解决方案2】:
  1. 您必须找到要更改的图像现有颜色的 RGB。
  2. 仅供参考,您想将其更改为白色 RGB 值为 (255,255,255),黑色 RGB 值为 (0,0,0)

  3. 如果你应用正确的方法,下面的方法很容易改变颜色

    private BufferedImage changeColor(BufferedImage image, int srcColor, int replaceColor)
    {
        BufferedImage destImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = destImage.createGraphics();
        g.drawImage(image, null, 0, 0);
        g.dispose();
    
    
        for (int width = 0; width < image.getWidth(); width++)
        {
            for (int height = 0; height < image.getHeight(); height++)
            {
    
               if (destImage.getRGB(width, height) == srcColor)
                {
                   destImage.setRGB(width, height, replaceColor);
                }
    
            }
        }
    
        return destImage;
    }
    

【讨论】:

  • 这将图像更改为黑白,但不会使其像从头开始制作。
  • 您只需创建图像,在线查看多个可用资源。
【解决方案3】:

你必须以正确的方式使用ColorConvertOp

  1. 创建源图像
  2. 应用过滤器
  3. 保存目的地

示例:

BufferedImage src = ImageIO.read(new File("/Users/***/Documents/Photograph.jpg"));

ColorConvertOp op = 
    new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
BufferedImage dest = op.filter(src, null);

ImageIO.write(dest, "PNG", new File("/Users/bng/Documents/rendered2.png"));

源代码:

目的地:

【讨论】:

  • 如果你喜欢 one-liners 你可以ImageIO.write(new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null).filter(ImageIO.read(new File("/Users/***/Documents/Photograph.jpg")), null), "PNG", new File("/Users/bng/Documents/rendered2.png"));
  • 你的一个班轮很好。不知何故不会将图像转换为从头开始制作的。正在搜索其他一些选项。
  • ColorSpace.CS_GRAY 确实创建了 灰度 图像而不是 黑白 图像...
  • @Karan Verma:这是您问题的原始代码,指的是ColorSpace.CS_GRAY。如果您不想要灰度图像,那是您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2011-02-11
  • 2021-05-02
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多