在读取图像文件时保持编码

时间:2013-11-25 16:19:44

标签: 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图像文件会丢失编码?

2 个答案:

答案 0 :(得分:1)

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

我的日常工作涉及了解TIFF规范,所以当我看到人们在没有先咨询规范或关注一些奇怪的特殊案例时,我总是会感到有些烦躁不安。存在于野外,现在需要处理,因为别人没有完全理解规范并创建了一个商业产品,产生了数千种这些野兽(我正在看着微软用于制作“旧式JPEG压缩”TIFF,但我也看到了一种Java产品,它定义了一种使用浮点数作为组件值的图像,而没有费心去除(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规范(应该是这样)。

答案 1 :(得分:0)

尝试在编写器中指定编码。

http://docs.oracle.com/javase/7/docs/api/java/io/OutputStreamWriter.html#OutputStreamWriter%28java.io.OutputStream,%20java.nio.charset.CharsetEncoder%29

包裹您的信息流:

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));

对于图像,您应该查看ImageIO包。

http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#getImageWriter%28javax.imageio.ImageReader%29