java - Java中的图像差异

标签 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;
}

我有一个比较两个缓冲图像的函数。如果两个图像差异更大,它会返回更高的错误。唯一的问题是它运行速度非常慢,所以有没有更有效的方法来做到这一点?任何降低运行时间的方法都会有帮助。

最佳答案

是的,您可以优化内部 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);

关于java - Java中的图像差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172607/

相关文章:

java - 如何从 Java 代码运行 sed 命令

java - 为什么 ArrayList.clear() 方法不释放内存?

r - 使用quadprog进行投资组合优化

sql-server - 在 SQL Server 上监控什么

javascript - 使用 jQuery 删除类的正确方法

optimization - 为什么这段代码没有针对所有三点进行优化?

JAVA 在每次出现特定符号时在字符串中换行

java - 使用 Java 在 Windows 上查找用户的“我的文档”文件夹的正确方法?

java - 在Java中验证,使用和重用密码和Kerberos凭证

JAVA 文件树模型对于随身碟来说速度缓慢