png和bmp上的java按位操作会产生不同的结果?(相同的32位ARGB表示)
我正试图在Android平台上复制一些图像过滤软件。桌面版本与BMP一起工作,但在png文件上崩溃
当我对两张图片(每个对应像素的32位整数)进行异或运算时,两个软件的结果非常不同
我确信我的代码没有错,因为这是一项如此简单的任务,但它就在这里
const int aMask = 0xFF000000;
int xOrPixels(int p1, int p2) {
return (aMask | (p1 ^ p2) );
}
Java桌面软件使用的JAI库的定义可以在here和states中找到
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也有类似的问题
这是一个图像,在Android上使用png将两个源图像在底部异或。与位图xOr'd相同的文件为我提供了一个填充了0xFFFFFF(白色)的位图,完全没有像素。我检查了Android ap的二进制值,对我来说似乎是对的
Gav
注意,当我说(相同的32位ARGB表示法)时,我的意思是安卓允许您将png文件解码为这种格式。虽然这可能会给一些错误留出空间(png是无损的吗?)我在输出上得到完全不同的颜色
# 1 楼答案
我检查了你截图上的几个值
输入像素:
与相应的输出像素非常相似
在我看来,您正在对两个密切相关的图像进行异或运算(在每个颜色通道中反转),因此,输出必然接近0xffffff
如果你对两个不同的图像进行异或运算,也许你会得到更像你所期望的东西
问题是,为什么要对像素值进行异或运算
# 2 楼答案
png可能具有错误的gamma或颜色空间,并且在加载时会进行转换,从而影响结果。某些版本的Photoshop有一个错误,他们用错误的伽马保存PNG
# 3 楼答案
在代码发布之前你在做什么
PNG是一种压缩格式,使用deflate算法(参见RFC2083的第5节),因此,如果您只是进行二进制读取,则不会查看实际像素