gpt4 book ai didi

java - 计算 Java 中两个 ARGB 整数之间差异的最快方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:06 27 4
gpt4 key购买 nike

给定一个来自 DataBuffer 的整数,其中包含带有掩码的 ARGB 数据

A = 0xFF000000R = 0xFF0000G = 0xFF00B = 0xFF

我正在执行以下操作,但想知道 Java 中是否没有更快的方法?

        DataBuffer db1 = img1.getData().getDataBuffer();
DataBuffer db2 = img2.getData().getDataBuffer();

int x, y;
int totalDiff = 0;
for (int i = 0; i < WIDTH * HEIGHT; ++i) {
x = db1.getElem(i);
y = db2.getElem(i);

totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
+ Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
+ Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16 ));
}

最佳答案

如果您真的需要加速,您可以检查 DataBuffer 的类型并为具体类型提供优化代码,这样您就可以保存对 getElem(i) 的调用>。这会稍微加快您的代码速度。

像这样:

    DataBuffer db1 = img1.getData().getDataBuffer();
DataBuffer db2 = img2.getData().getDataBuffer();

int totalDiff = 0;
int x, y;
if (db1 instanceof DataBufferInt && db2 instanceof DataBufferInt) {
int[] data1 = ((DataBufferInt) db1).getData();
int[] data2 = ((DataBufferInt) db2).getData();
for (int i = 0; i < WIDTH * HEIGHT; ++i) {
x = data1[i];
y = data2[i];

totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
+ Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
+ Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16));
}
} else {
for (int i = 0; i < WIDTH * HEIGHT; ++i) {
x = db1.getElem(i);
y = db2.getElem(i);

totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
+ Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
+ Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16));
}
}

编辑:另一个会给你带来更高速度的想法。如果这只是一种启发式方法,则可能足以计算图像的某种“下采样”版本的差异。将 ++i 替换为 i+=10 并获得 10 倍的加速。当然,这是否有意义取决于您的图像类型。

编辑:在一条评论中,您提到它是 GA 的适应度函数……在这种情况下,从图像中随机抓取 100 个(或仅 10 个?)位置并比较这些位置的像素可能就足够了。获得的加速很可能会超过精度损失。

关于java - 计算 Java 中两个 ARGB 整数之间差异的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5661762/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com