java - 读取图像文件时保持编码

标签 java input encoding tiff

我当前正在阅读一个包含元数据和 tiff 图像的文件,如下所示:

private String readFile( String file ) throws IOException {
    File file = new File(filename);
    int size = (int) file.length();     
    byte[] bytes = new byte[size];
    BufferedInputStream buf = new BufferedInputStream(new   FileInputStream(file));
    buf.read(bytes, 0, bytes.length);
    buf.close();
    ...
}

我解析元数据+图像内容,然后尝试像这样输出tiff,其中img是一个字符串:

    writer = new BufferedWriter( new FileWriter( "img.tiff"));
    writer.write(img);
    writer.close();

为什么 tiff 图像文件的编码丢失?

最佳答案

为什么要尝试重写该文件? 如果答案是“我正在尝试更改文件中的一些元数据”。我强烈建议您使用一组专门用于处理 TIFF 元数据的工具,特别是如果您打算操作/更改元数据,因为 TIFF 文件中有几个特殊情况的数据元素,它们确实不喜欢被移动愉快地。

我的日常工作涉及了解 TIFF 规范,因此当我看到人们在没有先查阅规范或不关心一些奇怪的特殊情况的情况下就对 TIFF 的内部进行研究时,我总是感到有点坐立不安。存在于野外,现在需要处理,因为其他人没有完全理解规范并创建了一个商业产品,产生了数千只这样的野兽(我正在看 Microsoft 制作“旧式 JPEG 压缩”TIFF,但我也看到过一种 Java 产品,它定义了一种图像类型,该图像使用 float 作为组件值,而无需费心 (1) 将它们规范化为规范会让你这样做或(2)有一个标准来定义组件值的预期最小值和最大值)。

my code base (这是一个商业产品),你可以像这样完成你的工作:

TiffFile myTiff = new TiffFile();
myTiff.read(someImageInputStream);

for (TiffDirectory dir : myTiff.getImages())
{
    // a TiffDirectory contains a collection of TiffTag objects, from which the
    // metadata for each image in the document can be read/edited
    // TiffTag definitions can be found [here][2].
}
myTiff.save(someImageOutputStream); // writes the whole TIFF back

总的来说,我们发现真正想要这样做的是高级客户。在大多数情况下,我们发现客户更关心更高级别的操作,例如将 TIFF 文件组合成单个文档或提取页面,为此我们有一个不同的 API,它的重量要轻得多,并且不需要您了解TIFF 规范(应该如此)。

关于java - 读取图像文件时保持编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20197894/

相关文章:

java - 无法从控制台获取完整的字符串输入

authentication - 了解跨域用户认证

iphone - iOS 5 如何录制 FLAC 或从 CAFF 编码为 FLAC

java - Tomcat 9 中的编码问题 "The valid characters are defined in RFC 7230 and RFC 3986"

java - 使用 Mockito 使用 @Value 时如何模拟 map

c# - Java Force 接受 SSL 证书

java - 为什么在使用 JPA2 创建模式期间会忽略一个实体?

java - Download 类是不可变性的糟糕候选者吗?

c++ - 如何在 C++ 中模拟按键

javascript - 无法从 Bootstrap 4 中的自定义输入文件读取未定义的属性 'path'