我目前正在阅读包含元数据和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图像文件会丢失编码?
答案 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)
尝试在编写器中指定编码。
包裹您的信息流:
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
对于图像,您应该查看ImageIO包。