png和bmp上的按位运算会得到不同的结果吗? (相同的32位ARGB表示)

时间:2009-06-22 16:51:59

标签: java image-processing

我正在尝试在Android平台上复制一些图像过滤软件。桌面版本适用于bmps但在png文件上崩溃。

当我来到xOr两张图片(每个对应像素的32位整数)时,我得到两个软件的非常不同的结果。

我确信我的代码没有错,因为它是一个如此简单的任务,但在这里它是;

const int aMask = 0xFF000000;

int xOrPixels(int p1, int p2) {
    return (aMask | (p1 ^ p2) );
}

可以找到Java桌面软件使用的JAI库的定义here和状态;

 The destination pixel values are defined by the pseudocode:

 dst[x][y][b] = srcs[0][x][y][b] ^ srcs[1][x][y][b];

其中b是带(即R,G,B)。

有什么想法?我和AND和OR有类似的问题。

这是使用png在Android底部的两个源图像xOr'd的图像。与位图xOr'd相同的文件给我一个填充0xFFFFFFFF(白色)的位图,根本没有像素。我检查了Android ap的二进制值,它似乎对我来说....

Android

GAV株系

注意当我说(相同的32位ARGB表示)我的意思是android允许你将png文件解码为这种格式。虽然这可能会给出一些错误(png是无损的吗?)但我在输出上会得到完全不同的颜色。

3 个答案:

答案 0 :(得分:0)

png可能具有错误的gamma或颜色空间,并且它会在加载时进行转换,从而影响结果。某些版本的Photoshop有一个错误,他们用错误的伽玛保存了png。

答案 1 :(得分:0)

在发布代码之前你在做什么?

PNG是一种压缩格式,使用deflate算法(参见RFC2083的第5节),所以如果您只是进行二进制读取,则不会查看实际像素。

答案 2 :(得分:0)

我从你的截图中检查了几个值。

输入像素:

  • 左上角,0xc3cbce ^ 0x293029 = 0xeafbe7
  • 颈背,0xbdb221 ^ 0x424dd6 = 0xfffff7

与相应的输出像素非常相似。

在我看来,你正在对两个密切相关的图像进行异或(在每个颜色通道中反转),因此,输出必须接近0xffffff。

如果你要拍摄两张不同的照片,也许你会得到更像你期望的东西。

问题是,为什么要对XOR像素值进行异或?