Java中的图像差异

时间:2014-10-03 02:49:28

标签: java performance optimization bufferedimage difference

public float calculateDifference(BufferedImage b1, BufferedImage b2){
    float error = 0;
    for(int y = 0; y < sizeY; y++){
        for(int x = 0; x < sizeX; x++){
            Color c1 = new Color(b1.getRGB(x, y));
            Color c2 = new Color(b2.getRGB(x, y));
            error += Math.abs(c1.getRed() - c2.getRed());
            error += Math.abs(c1.getGreen() - c2.getGreen());
            error += Math.abs(c1.getBlue() - c2.getBlue());
            error += Math.abs(c1.getAlpha() - c2.getAlpha());
        }
    }
    return error;
}

我有这个比较两个bufferedimages的功能。如果两个图像更不同,则返回更高的错误。唯一的问题是它运行得非常慢,所以有没有更有效的方法来做到这一点?任何降低运行时间的方法都会有所帮助。

1 个答案:

答案 0 :(得分:1)

是的,您可以优化内部for循环。 不要创建新的Color对象。直接使用RGB的int值。这将限制创建的对象数量和调用垃圾收集的频率。

int color1 = b1.getRGB(x, y);
int alpha1 = (color1 >> 24) & 0xFF;
int red1 = (color1 >> 16) & 0xFF;
int green1 = (color1 >> 8) & 0xFF; 
int blue1 = (color1 >> 0) & 0xFF;

int color2 = b2.getRGB(x, y);
int alpha2 = (color2 >> 24) & 0xFF;
int red2 = (color2 >> 16) & 0xFF;
int green2 = (color2 >> 8) & 0xFF; 
int blue2 = (color2 >> 0) & 0xFF;

error += Math.abs(red1 - red2);
error += Math.abs(green1 - green2);
error += Math.abs(blue1 - blue2);
error += Math.abs(alpha1 - alpha2);