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

时间:2011-03-19 08:03:50

标签: java size bufferedimage

我试图将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或更小,图像变小。如何在这些操作后继续处理图像尺寸?

谢谢,

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果现在真的有从元数据中读取压缩质量的方法,作为最后的手段,您可以做的是使用二进制搜索来获得质量。从0.5开始,如果文件太小,请尝试0.75等等(最多5次尝试左右)。这当然有点慢,但根据您的使用情况,它可能没问题。