【问题标题】:Convert colored image to back/white image将彩色图像转换为背面/白色图像
【发布时间】:2013-09-12 07:38:32
【问题描述】:

我正在将彩色图像转换为黑白图像。我为此使用 BufferedImage,类型为 TYPE_BYTE_BINARY。但输出图像未正确转换。例如,如果图像包含黑色背景上的蓝色字母,则该部分的结果图像是全黑的。有谁能够帮我?我的代码如下。

//Invert the colormodel
byte[] map = new byte[] { (byte) (255), (byte) (0) };
IndexColorModel colorModel = new IndexColorModel(1, 2, map,
map, map);

BufferedImage bufferedImage = new BufferedImage(
img.getWidth(null), img.getHeight(null),
BufferedImage.TYPE_BYTE_BINARY, colorModel);
Graphics2D g2 = bufferedImage.createGraphics();
g2.drawImage(img, 0, 0, null);
g2.dispose();

【问题讨论】:

  • 检查this example
  • @MadProgrammer 我在下面发布了一个答案,但我意识到大部分内容都包含在您的链接中。
  • 抖动到双色调对于传真来说不是一个好主意,因为它会增加压缩数据的大小。您可能想要使用的是一种动态阈值算法,它可以处理细微的色差并生成好看的图像。

标签: java image bufferedimage tiff


【解决方案1】:

蓝色的强度非常低,因此蓝色(如 RGB(0, 0, 255))在转换为具有 50% 阈值的黑白时会变成黑色。在转换为黑白之前尝试使原始图像变亮,以增加图像中出现白色的部分。

您可以在转换之前使用RescaleOp 使图像变亮,或者将一个实例与您的图像一起传递给以BufferedImageOp 作为参数的drawImage 方法。请注意,您可以独立缩放 R、G 和 B 值。

【讨论】:

    【解决方案2】:
    BufferedImage bufferedImage= new BufferedImage(img.getWidth(null), img.getHeight(null); 
        ColorConvertOp op = 
            new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
        op.filter(bufferedImage, bufferedImage);
    

    检查这个link

    【讨论】:

    • 我的目标是将普通图像转换为 tiff 图像。此 tiff 格式用于传真。因此,我在从 BufferedImage 创建 tiff 文件时使用压缩组 4。如果不使用 BufferedImage.TYPE_BYTE_BINARY ,然后我得到以下错误。线程“main”java.lang.Error 中的异常:仅双层图像支持双层编码。当我使用它时,会创建 tiff 文件,但一些深色重叠。我的总代码如下。
    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多