图像分辨率更改但我只是尝试旋转图像

时间:2013-06-11 04:09:14

标签: java javax.imageio imgscalr

此代码是否会改变原始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);

}

2 个答案:

答案 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。