首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改ImageIO写Endianness

如何更改ImageIO写Endianness
EN

Stack Overflow用户
提问于 2017-07-03 13:52:53
回答 1查看 1.3K关注 0票数 1

我将PDF的RenderedImage写入一个tiff文件,使用

代码语言:javascript
复制
javax.imageio.ImageIO.write(RenderedImage,"tif" ,file)

我希望我的tiff文件endian是小endian,但是它用大端写,可以帮助解释如何将它更改为小endian吗?

还可以解释为什么使用大端写入的数据比原始文件的大小要大吗?我试图在java代码之外将数据转换为小endian,文件大小从16 MB大幅度减少到943字节。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 08:22:30

ImageIO API没有一种标准的方法来指定endianness (字节顺序)。如何做到这一点,或它是否被支持,是插件依赖的。

对于TIFF格式,存在多个插件(JAI、GeoTIFF、TwelveMonkeys、JDK9)。所有提到的插件(据我所知)都支持使用发送到ImageWriter.write(...)的流元数据来设置endianness。字节顺序是您可以在TIFF流元数据中设置的唯一字段。

代码语言:javascript
复制
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next();
writer.setOutput(stream);

IIOMetadata streamMetadata = writer.getDefaultStreamMetadata();

IIOMetadataNode root = new IIOMetadataNode("com_sun_media_imageio_plugins_tiff_stream_1.0");
IIOMetadataNode byteOrder = new IIOMetadataNode("ByteOrder");
byteOrder.setAttribute("value", order == LITTLE_ENDIAN ? "LITTLE_ENDIAN" : "BIG_ENDIAN");
root.appendChild(byteOrder);

streamMetadata .mergeTree("com_sun_media_imageio_plugins_tiff_stream_1.0", root);

// ...

writer.write(streamMetadata, new IIOImage(image, null, null), param);

此外,如果没有使用流元数据指定,TwelveMonkeys TIFF插件将使用它正在写入的ImageOutputStream中的字节顺序。以这种方式指定字节顺序在我看来更直截了当,但显然插件之间的兼容性较差。

代码语言:javascript
复制
try (ImageOutputStream stream = ImageIO.createImageOutputStream(out)) {
    stream.setByteOrder(ByteOrder.LITTLE_ENDIAN);

    ImageIO.write(image, "TIFF", stream);
}

关于文件大小,大多数已知的TIFF插件默认会写入未压缩的图像数据。不幸的是,没有办法直接使用ImageIO方便方法指定压缩设置,所以使用这些方法编写的任何TIFF都将被解压缩。

相反,ImageIO API要求您获得要写入的格式的ImageWriter,并传入ImageWriteParam以指定压缩设置。请注意,支持的压缩类型可能因插件而异。还请注意,哪种压缩类型会产生最佳的压缩速率,取决于您要压缩的图像数据。

代码语言:javascript
复制
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next();
writer.setOutput(stream);

ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("LZW"); // "Zlib", "PackBits", "JPEG", "CCITT T.4", "CCITT T.6" etc.
param.setCompressionQuality(0.5f); // Applies only to some compression types. Generally:
                                   // * 0.0 means highest compression
                                   // * 1.0 means best quality

您可以使用以下方法查询当前插件中可用的压缩类型:

代码语言:javascript
复制
String[] types = param.getCompressionTypes();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44887355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档