Java 图像分辨率正在更改,但我仅尝试旋转图像

Java 图像分辨率正在更改,但我仅尝试旋转图像,java,javax.imageio,imgscalr,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_Or

这段代码会改变原始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);

}

我不知道为什么,但是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();

迟来的回答,但无论如何

由于使用ImageIO的JPEG读/操作/写循环总是有损的,并且您所做的只是旋转,因此您应该从中查看LLJTran,如本文所述

使用该软件包,您应该能够从JPEG块压缩的一个特殊功能中获益,从而进行无损JPEG转换


仍然不明白为什么您的原始代码会更改图像分辨率,也不明白为什么您提出的解决方案会修复它。。。对我来说,这听起来像个bug,应该向Oracle报告。但我知道的是,将JPEG质量设置为1.0(100%)并不是JPEG的本意,它会导致大量文件质量毫无提高(可能比以原始文件的质量存储更糟糕)假设输入已经是压缩的JPEG。

图像大小可能会改变,以允许整个图片在旋转时保持可见-即,在45度时,需要更改宽度和高度,以允许渲染图像内容检查其是否有用。@MadProgrammer我认为Exif方向只能是90度的倍数。所以,尺寸只能翻转。谢谢你,先生。这帮助我摆脱了com.sun.*软件包和JPEGImageEncoder。谢谢haraldK!我会去看mediautil的。现在还不晚,因为我需要改进代码。我想,如果我将文件转换为JPEG格式进行旋转,可能会降低质量,这是有道理的。我知道JPEG是有损的,应该意识到这样旋转会有损。