2013-08-28 70 views
0

我有一个图像(147 KB),我想缩小到100KB以下。下面的代码试图做到这一点,但是当图像出现在另一侧时,widht和height会缩小,但图像上的磁盘空间从147变为250!它应该变得更小而不是更高...错误代码使缓冲图像更小

你能告诉我为什么这段代码没有这样做吗?

感谢

//Save image 
     BufferedImage resizeImagePng = resizeImage(originalImage, type, newLargeImageLocation); 

    //Resize and save 
    ImageIO.write(resizeImagePng, "png", new File(newSmallImageLocation)); 



//Create new image 
    private static BufferedImage resizeImage(BufferedImage originalImage, int type, String newLargeLocation) throws Exception{ 

      //Get size of image 
      File file =new File(newLargeLocation); 

      //File size in KBs 
      double bytes = file.length(); 
      double kiloBytes = bytes/1024; 

      double smallWidth = originalImage.getWidth(); 
      double smallHeight = originalImage.getHeight(); 

      double downMult = 1; 

      //If image is too large downsize to fit the size 
      if (kiloBytes>MAX_IMAGE_SIZE_IN_KYLOBITES) { 

       downMult = MAX_IMAGE_SIZE_IN_KYLOBITES/kiloBytes; 

       smallWidth *= downMult; 
       smallHeight *= downMult; 
      } 

      //Final dimensions 
      int finalHeight = (int)smallHeight; 
      int finalWidth = (int)smallWidth; 

      //Init after 
      BufferedImage after = new BufferedImage(finalWidth, finalHeight, BufferedImage.TYPE_INT_ARGB); 

      //Scale 
      AffineTransform at = new AffineTransform(); 
      at.scale(downMult, downMult); 

      //Scale op 
      AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
      after = scaleOp.filter(originalImage, after); 

      //Return after 
      return after; 
     } 
+0

你可以在你写图片的地方显示代码吗?也许你正在写的格式不能像原始格式那样压缩。 – dnault

+2

保存的大小主要是用于保存的图像格式和设置。你是否可能阅读JPG并以其他格式保存? – kiheru

+0

刚刚添加了保存代码。文件文件是一个.png结尾的图像 –

回答

1

2个问题,我也有一个调整大小的程序,但我调整图像有点不同:

首先,我创建一个Dimension对象(不是真正需要的,但designwise似乎有点更好)从一个BufferedImage对象开始称为原始

final int width = original.getWidth(); 
final int height = original.getHeight(); 
final Dimension d = new Dimension(width, height); 

在我的情况是不是档案大小而是关于最大宽度和/或高度,所以不克细化到细节我计算一个新的Dimension对象基于上面创建的一个。 新的Dimension对象称为缩放。

这是我如何获得新的缩放缓冲的图像:

public BufferedImage resizeExact(final BufferedImage original, final Dimension scaled, final Dimension offset) { 
    final Image newImage = original.getScaledInstance(scaled.width, scaled.height, Image.SCALE_SMOOTH); 
    final BufferedImage bufferedImage = new BufferedImage(newImage.getWidth(null), 
                  newImage.getHeight(null), 
                  BufferedImage.TYPE_INT_BGR); 
    bufferedImage.createGraphics().drawImage(newImage, offset.width, offset.height, null); 
    return bufferedImage; 
} 

使用这个代码,我得到一个BufferedImage称为resizedImage需要得到写入到一个OutputStream了,为了这个,我用这个代码:

ImageIO.write(resized, "jpg", out); 
out.close(); 

在这里我讲第二个问题:我使用标准的ImageIO类来将BufferedImage写成jpeg文件。这里的问题是JPEG编码器通常使用压缩因子,因子越高,结果文件越小,但生成的文件质量损失越多。该代码使用70%的默认压缩系数。这很适合我。但是,如果同意要更改此参考,则此参考解释了如何执行此操作:Setting jpg compression level with ImageIO in Java。请注意,将其更改为100%本质上是较低的压缩系数。

您的代码片段并未显示您最终如何创建jpeg文件(我假设您也使用jpeg)。如果你的原始图像被压缩比例为40%(不太可能,因为那么你会得到一个糟糕的图像,我认为)如此unjpeged你有100%,如果你想减少文件大小为80%,你减少图像的大小到80%,如果您使用70%的压缩系数压缩它,您的最终结果将是56%,这大于40%。

希望这会有所帮助。但是,如果您指定如何编写jeg映像(可能使用另一个库,而不是javax.imageio的标准库),则可能有另一种指定压缩因子的方法。