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

时间:2011-10-03 12:57:48

标签: java apache-commons tiff

我正在尝试使用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 pug?

1 个答案:

答案 0 :(得分:1)

我不熟悉Sanselan,但我发现有一个ImageInfo.COLOR_TYPE_GRAYSCALE常量,我猜它可以用在params的{​​{1}}参数图中。

我没找到Sanselan的javadoc,他们的link被破坏了,你还有一个更新吗?

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

writeImage

确保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_GRAY