【问题标题】:How to generate tiff image using CCITT T.4 technique for images with transparent background如何使用 CCITT T.4 技术为具有透明背景的图像生成 tiff 图像
【发布时间】:2015-10-29 12:29:21
【问题描述】:

我有一个手写文本作为 BufferedImage 对象。我需要使用 CCITT T.4 压缩技术将其生成为 tiff 图像文件。

但 CCITT T.4 要求图像为 1 位深度图像。我在 BufferedImage 中的图像是 32 位深度的。当我使用convert1() funtion 将其转换为 1 位时,黑色字体消失了,整个图像变黑了。

我在别处读到,由于 1 位图像是黑白的,因此在转换为 1 位时,它会将透明层位转换为黑色。我的手写笔记也是黑色的,所以整个图像都变黑了。

我能够毫无问题地使用 LZW 技术生成 tiff。甚至使用 CCITT T.4,但仅适用于 24 位图像。当图像为 32 位(带有额外的透明层)时,图像将变为黑色。 谁能指导我如何将图像转换为 CCITT T.4 格式以获得具有透明度的图像。

【问题讨论】:

  • 您是否尝试在转换前将图像置于白色背景上?如果您的图像是透明的黑色文本,您还可以使用正确的 Porter/Duff 模式在文本“后面”绘制一个完全不透明的白色矩形(我认为它是 DstAtop,请参阅 AlphaComposite 类)。
  • 我添加了 AlphaComposite.DsAtop,然后使用 setPaint White 和 fillrect 方法将背景设置为白色,现在它可以工作了。万分感谢!然而,上面的黑色手写文字仍然不是连续的线条。这些线以虚线(虚线)的形式出现。任何想法如何平滑线条?
  • 不完全确定convert1() 方法的工作原理(我也没有你的手写图像),所以我只是猜测。通常,您可以调整阈值,以使更多或更少的像素变为黑色。或者您可以尝试使用RescaleOp 调整亮度/对比度。

标签: java bufferedimage transparent tiff


【解决方案1】:

感谢 haraldK 的宝贵建议,我能够将 32 位 TIF 图像转换为 1 位图像并使用 CCiTT T.4 压缩对其进行压缩。生成的图像清晰,线条没有中断。

这是我修改后的代码:

BufferedImage image32bit; 
//image32bit is populated

Graphics2D g=(Graphics2D)image.createGraphics(); 

AlphaComposite ac=AlphaComposite.getInstance(AlphaComposite.DST_ATOP,0.85f);
//0.85f is the opacity threshold value to make more or less pixels black. 

g.setColor(Color.WHITE);
g.fillRect(0,0,image.getWidth(),image.getHeight());
g.dispose()

//Convert to monochrome 1 bit image using image4j jar - convert1 method
BufferedImage singleBitImage=ConvertUtil.convert1(image32bit);

//Use JAI jar to set compression as CCITT T.4 and write out the image
//Insert code to create writer and writeParam ...
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionType("CCITT T.4");

writer.write(null, iioImage, writeParam);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-04-23
    • 2016-12-08
    • 2015-05-15
    • 2014-02-27
    相关资源
    最近更新 更多