繁体   English   中英

在Java中进行读写旋转操作后如何保存jpeg图像文件大小?

[英]How to save jpeg Image file size after read--rotate-write operations in Java?

我试图读取JPEG图像作为BufferedImage,旋转并将其另存为文件系统中的另一个jpeg图像。 但是有一个问题:执行这些操作后,我无法继续处理相同的文件大小。

这里的代码

//read Image
BufferedImage img = ImageIO.read(new File(path));
//rotate Image
BufferedImage rotatedImage = new BufferedImage(image.getHeight(),
            image.getWidth(), BufferedImage.TYPE_3BYTE_BGR);
    Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics();
    g2d.rotate(Math.toRadians(PhotoConstants.ROTATE_LEFT));

    int height=-rotatedImage.getHeight(null);
    g2d.drawImage(image, height, 0, null);
    g2d.dispose();

//Write Image
    Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
    ImageWriter writer = (ImageWriter)iter.next();
    // instantiate an ImageWriteParam object with default compression options
    ImageWriteParam iwp = writer.getDefaultWriteParam();
    try {
        FileImageOutputStream output = null;
        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        iwp.setCompressionQuality(0.98f);   // an integer between 0 and 1
        // 1 specifies minimum compression and maximum quality

        File file = new File(path);
        output = new FileImageOutputStream(file);
        writer.setOutput(output);
        IIOImage iioImage = new IIOImage(image, null, null);
        writer.write(null, iioImage, iwp);
        output.flush();
        output.close();
        writer.dispose();

是否可以在开始时访问原始jpeg图像的compressionQuality参数。 当我将压缩质量设置为1时,图像会变大。 否则,我设置为0.9或更小图像会变小。 完成这些操作后如何处理图像尺寸?

谢谢,

您是什么意思-您想读取原始文件的压缩率吗?

请注意,即使使用相同的压缩设置,由于JPEG压缩算法,文件大小可能也会有所不同。 因此,即使所有选项(例如压缩率,质量设置等)都相同,旋转后的图像也不总是具有与未旋转/原始版本完全相同的尺寸。

如果现在确实存在从元数据中读取压缩质量的方法,作为最后的选择,您可以做的是使用二进制搜索质量。 从0.5开始,如果文件太小,则尝试0.75,依此类推(最多5次尝试)。 当然,这有点慢,但是根据您的用例,可能还可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM