gpt4 book ai didi

java - 有没有办法控制位深度=1(黑白)的 TIFF-PNG 转换中哪些像素变黑(阈值)

转载 作者:行者123 更新时间:2023-12-01 13:57:02 25 4
gpt4 key购买 nike

嗯,在将图像从 TIFF 转换为 PNG 格式的过程中,我真的希望最终图像尽可能最小,因此我将位深度设置为 1(黑白),我正在处理签名图像。我的问题是我“丢失”了一些像素,因为原始图像“太白”并且转换过程忽略了它们。

我想要的是一种告诉 PNG 编码器应用 threshold 的方法。在图像中,例如,如果灰度级大于 240,则为白色,否则为黑色。或者也许是图像不会丢失太多像素的任何其他方式,因为图像是签名,我必须在浏览器中显示它。这是一个示例:

sample signature

这是我用来将图像从 TIFF 转换为 PNG 格式的代码:

public byte[]tiffToPng(byte[]tiffBytes) throws IOException {

SeekableStream stream = new ByteArraySeekableStream(tiffBytes);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", stream, null);
RenderedImage renderedImage = decoder.decodeAsRenderedImage(0);

PNGEncodeParam pngEncodeParam = PNGEncodeParam.getDefaultEncodeParam(renderedImage);
pngEncodeParam.setBitDepth(1);

ByteArrayOutputStream pngBytesStream = new ByteArrayOutputStream();
ImageEncoder encoder = ImageCodec.createImageEncoder("png", pngBytesStream, pngEncodeParam);
encoder.encode(renderedImage);
pngBytesStream.flush();
return pngBytesStream.toByteArray();
}

最佳答案

好吧,过了一段时间,我首先做了 conversion of the RenderedImage to a BufferedImage ,然后循环 RGB 值并完成阈值处理。最后,我将生成的图像编码为 PNG(位深度=1)。就是这样:

public byte[]tiffToPng(byte[]tiffBytes) throws IOException {
SeekableStream stream = new ByteArraySeekableStream(tiffBytes);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", stream, null);
RenderedImage tiffRenderedImage = decoder.decodeAsRenderedImage(0);

BufferedImage tiffBufferedImage = toBufferedImage(tiffRenderedImage);
for (int y = 0; y < tiffBufferedImage.getHeight(); y++) {
for (int x = 0; x < tiffBufferedImage.getWidth(); x++) {
int rgb = tiffBufferedImage.getRGB(x, y);
int a = (rgb>>24)&0xFF;
int r = (rgb>>16)&0xFF;
int g = (rgb>>8)&0xFF;
int b = (rgb>>0)&0xFF;
if(a == 0xFF && r == g && g == b) {
if(r < 254) {
tiffBufferedImage.setRGB(x, y, 0xFF000000);
} else {
tiffBufferedImage.setRGB(x, y, 0xFFFFFFFF);
}
}
}
}

PNGEncodeParam pngEncodeParam = PNGEncodeParam.getDefaultEncodeParam(tiffBufferedImage);
pngEncodeParam.setBitDepth(1);
ByteArrayOutputStream pngBytesStream = new ByteArrayOutputStream();
ImageEncoder encoder = ImageCodec.createImageEncoder("png", pngBytesStream, pngEncodeParam);
encoder.encode(tiffBufferedImage);
pngBytesStream.flush();
return pngBytesStream.toByteArray();
}

public BufferedImage toBufferedImage(RenderedImage img) {
if (img instanceof BufferedImage) {
return (BufferedImage) img;
}
ColorModel cm = img.getColorModel();
int width = img.getWidth();
int height = img.getHeight();
WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
Hashtable properties = new Hashtable();
String[] keys = img.getPropertyNames();
if (keys != null) {
for (int i = 0; i < keys.length; i++) {
properties.put(keys[i], img.getProperty(keys[i]));
}
}
BufferedImage result = new BufferedImage(cm, raster, isAlphaPremultiplied, properties);
img.copyData(raster);
return result;
}

这是最终的图像:

signature succesfully converted PNG 1 bit depth

关于java - 有没有办法控制位深度=1(黑白)的 TIFF-PNG 转换中哪些像素变黑(阈值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19571771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com