gpt4 book ai didi

java - 如何用Java编写8位灰度tiff?

转载 作者:行者123 更新时间:2023-12-01 15:43:18 24 4
gpt4 key购买 nike

我正在尝试使用 Sanselan 将灰度图像写入 TIFF 文件。显然希望将数据保存为 8 位灰度文件,但不知何故我总是得到 24 位彩色文件。

我搜索了一般文件格式,特别是 ExifTagConstants.EXIF_TAG_PIXEL_FORMAT,但找不到任何有用的内容。

我也考虑过颜色配置文件,但似乎没有灰度图像。但他们都有古怪的名字——我可能只是忽略了正确的名字。

或者我必须使用不同的库吗?

这是我使用的代码(没有业务逻辑和实验性的东西:

    Test_Only_Sanselan:
try
{
final Map <String, Object> parameter = new HashMap <>();
parameter.put(org.apache.sanselan.SanselanConstants.PARAM_KEY_COMPRESSION,
org.apache.sanselan.formats.tiff.constants.TiffConstants.TIFF_COMPRESSION_UNCOMPRESSED);

final java.io.OutputStream output = new java.io.FileOutputStream("Test-1.tiff");
org.apache.sanselan.Sanselan.writeImage(image, output,
org.apache.sanselan.ImageFormat.IMAGE_FORMAT_TIFF, parameter);
output.close();
}
catch (final IOException exception)
{
LdfImage.log.info("! Could not create tiff image.", exception);
}
catch (final org.apache.sanselan.ImageWriteException exception)
{
LdfImage.log.info("! Could not create tiff image.", exception);
}

我想知道是否需要添加一个特殊参数。但我还没有找到有用的参数。

以下是对 Java 7 图像编写器的测试,它创建了正确的灰度图像。但作为 PNG 而不是 TIFF:

    Test_Only_Java_7:
try
{
final java.util.Iterator imageWriters = javax.imageio.ImageIO.getImageWritersByMIMEType ("image/png");
final javax.imageio.ImageWriter imageWriter = (javax.imageio.ImageWriter) imageWriters.next();
final java.io.File file = new java.io.File("Test-2.png");
final javax.imageio.stream.ImageOutputStream output = javax.imageio.ImageIO.createImageOutputStream(file);

imageWriter.setOutput(output);
imageWriter.write(image);
}
catch (final IOException exception)
{
LdfImage.log.info("! Could not create tiff image.", exception);
}

是否有适用于 imageio 的 TIFF 插件?

最佳答案

我不熟悉 Sanselan,但我看到有一个 ImageInfo.COLOR_TYPE_GRAYSCALE 常量,我猜它可以在给定的 params 参数映射中使用writeImage

我没有找到 Sanselan 的 javadoc ,他们的link已损坏,您能再提供一个最新的吗?

如果您想使用 JAI,您可以在这里获得灵感:

void get8bitImage(byte[] data, int width, int height) {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
byte[] rasterData = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
System.arraycopy(pixels, 0, rasterData, 0, pixels.length); // A LOT faster than 'setData()'
}

void main(String[] argv) {
TIFFEncodeParam ep = new TIFFEncodeParam();
FileOutputStream out = new FileOutputStream("c:\\test.tiff");
BufferedImage img = get8bitImage(myData);
ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, ep);
encoder.encode(img);
}

确保BufferedImageBufferedImage.TYPE_BYTE_GRAYimageType

关于java - 如何用Java编写8位灰度tiff?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635289/

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