此代码是否会改变原始JPEG的分辨率?我可以理解文件大小是否不同,因为JPEG质量设置可能不同但我不明白为什么这会调整图像大小。
File newfile=new File(mydestinationfolder.concat(imagename));
Files.move(file.toPath(),newfile.toPath(), REPLACE_EXISTING);
Rotation Orientation;
if ((Orientation=Exif_data.get_Exif_Orientation(newfile)) != null) {
System.out.println(Orientation.toString());
BufferedImage oldimage = ImageIO.read(newfile);
BufferedImage tmp = Scalr.rotate(oldimage, Orientation);
oldimage.flush();
oldimage=tmp;
ImageIO.write(oldimage, "JPEG", newfile);
}
答案 0 :(得分:1)
我不确定为什么,但ImageIO.write()的默认设置正在改变分辨率。如果我定义JPEG质量设置为100%的自定义编写器,则图像分辨率保持不变。
注意:最后的output.close()很重要,因为只要流打开,文件就会被锁定。
BufferedImage oldimage = ImageIO.read(newfile);
BufferedImage tmp = Scalr.rotate(oldimage, Orientation);
oldimage.flush();
oldimage=tmp;
Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter)iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
float quality=1.0f;
iwp.setCompressionQuality(quality);
FileImageOutputStream output = new FileImageOutputStream(newfile);
writer.setOutput(output);
IIOImage image = new IIOImage(oldimage, null, null);
writer.write(null, image, iwp);
writer.dispose();
output.close();
答案 1 :(得分:1)
迟到的答案,但无论如何......
由于使用ImageIO的JPEG读取/操作/写入循环总是有损的,而您正在做的就是旋转,您应该看看mediautil中的LLJTran,如{{3}所述}}。
使用该软件包,您应该能够受益于JPEG块压缩的特殊功能,以进行无损JPEG转换。
仍然不明白为什么你的原始代码会改变图像分辨率,也不知道为什么你提出的解决方案会修复它...听起来像是一个bug,应该报告给Oracle。但我所知道的是,将JPEG质量设置为1.0(100%)并不是JPEG的意思,并且会导致质量没有增加的大文件(可能比以质量存储更糟糕)如果输入已经是压缩的JPEG。