2012-07-05 63 views
2

我使用下面的代码合并两个图像。一个基本图像没有透明度,一个覆盖图像与透明度。 这些图像的文件大小分别是20kb和5kb。 一旦我合并了这两个图像,生成的文件大小> 100kb,因此至少是25kb大小的4倍。我预计文件大小小于25kb。合并两个图像 - > 4倍大小!如何减小文件大小?

public static void mergeTwoImages(BufferedImage base, BufferedImage overlay, String destPath, String imageName) { 

    // create the new image, canvas size is the max. of both image sizes 
    int w = Math.max(base.getWidth(), overlay.getWidth()); 
    int h = Math.max(base.getHeight(), overlay.getHeight()); 
    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

    // paint both images, preserving the alpha channels 
    Graphics2D g2 = combined.createGraphics(); 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.drawImage(base, 0, 0, null); 
    g2.drawImage(overlay, 0, 0, null); 
    g2.dispose(); 

    // Save as new image 
    saveImage(combined, destPath + "/" + imageName + "_merged.png"); 
} 

我的应用程序必须是具有非常好的性能,从而任何人都可以解释我为什么这个效应发生,我怎么能减少生成的文件大小?

非常感谢!编辑: 非常感谢您的回答。该saveImage代码:

public static void saveImage(BufferedImage src, String file) { 
    try { 
     File outputfile = new File(file); 
     ImageIO.write(src, "png", outputfile); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
} 
+0

也许你应该张贴'saveImage()的代码'。这就是内部图像被转换为​​文件的地方。 – 2012-07-05 17:25:58

+1

压缩算法对组合图像可能会比较困难,特别是在视觉上使图像复杂化的情况下。 – dlev 2012-07-05 17:29:56

回答

2

因为PNG是一种无损格式,只有两个有可能影响文件大小的主要因素:

  1. 多少像素的文件,并
  2. 格式可以压缩多少。

既然听起来你正在做一个覆盖,我猜#1没有改变。比较输入和输出文件的像素尺寸以仔细检查。

由于合并后的图像更加复杂,所以很有可能您会看到问题,所以PNG过滤算法在压缩文件时会遇到困难。关于这一点你可以做的不多,只是改变图像或切换到有损文件格式。

为了进一步解释,我们假设您有一张全白图像和一张全红图像。两者都是100x100像素。这些图像真的很容易压缩,因为你只需要编码:重复红色10000次。现在,假设您将这些图像合并为每个其他像素来自不同图像的方式。现在它是方格。如果你有一个好的编码机制,你可能仍然可以通过说:repeat [red,white] 10000次来编码。但即使使用这种理想的编码算法,您也会注意到,我已将编码消息的大小增加了很多。如果你没有一种完全适合这种事情的编码格式,那么这一切都将从这里走下坡路。

一般来说,图像像素越多且随机看起来越相似,结果文件就越大。

+0

谢谢,我会检查的! – didhavn 2012-07-05 21:20:18