如何将两个位图的像素值一起异或?

时间:2010-10-28 06:29:01

标签: java android mobile

我有一些位图A,我修改它以产生位图B.我想通过将A和B的像素值一起异或一起有效地产生位图D,使得D XOR A产生位图B并且D XOR B产生位图A.我想存储位图之间的差异,以便我可以改变我所做的更改。

到目前为止,我已经尝试过:

  1. 使用我称为.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR))的绘图对象将A绘制到B上。这适用于A和B的alpha在任何地方都是255但下面的任何内容都会产生不良结果。例如,如果我对A进行异或,我希望结果是空白图像。使用此xfer模式,大部分A将消失,但没有完整alpha的部分将保留。

  2. 使用我称为.setXfermode(new PixelXorXfermode(0))的绘图对象将A绘制到B上。这个xfer模式破坏了alpha值,这不是我想要的。我也不确定我可以将构造函数值设置为什么有用的东西。

  3. 我该怎么办?我需要一些将像素值视为普通值的东西,而不是将alpha值视为特殊情况。我需要这个相当快(就像上面的绘画类型一样)并且使用类似setpixel / getpixel的东西或者在byte []中自己进行计算将会太慢。

    编辑:任何人都可以帮忙吗?即使知道大多数人不相信有一个API调用会对我这样做会有所帮助。我几乎绝望地切换到OpenGL渲染,因为它有一个XOR渲染模式(我希望上面没有相同的问题)。

2 个答案:

答案 0 :(得分:0)

在绘制之前是否可以尝试对位图的字节数组进行异或运算?这将不会对alphas提供特殊处理,并且如果位图的大小相同,理论上可能会起作用。当然可能不会很快......

或许您可以使用上述方法之一,但以某种方式操纵字节数组中的alpha值并单独处理它们?

答案 1 :(得分:0)

作为替代方案,请考虑将原始图像复制到缓冲区中。撤消您只需将保存的图像复制到更改的图像上即可。它不应该占用更多的内存并避免异常问题。