有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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的二进制值,对我来说似乎是对的

Android

Gav

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


共 (3) 个答案

  1. # 1 楼答案

    我检查了你截图上的几个值

    输入像素:

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

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

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

    如果你对两个不同的图像进行异或运算,也许你会得到更像你所期望的东西

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

  2. # 2 楼答案

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

  3. # 3 楼答案

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

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