我无法解释这个(来自Eclipse调试的截图):
(0,0)处的像素没有设置为预期的值!其他所有像素都没问题,它们确实具有分配的相同值。
编辑 我进行了更深入的挖掘,setPixel的代码调用了一个本地函数:
![full screenshot](https://istack.dev59.com/03pph.webp)
![Code detail](https://istack.dev59.com/2bo7g.webp)
![Varialbles detail](https://istack.dev59.com/WJkp9.webp)
编辑 我进行了更深入的挖掘,setPixel的代码调用了一个本地函数:
1391 public void setPixel(int x, int y, int color) {
1392 checkRecycled("Can't call setPixel() on a recycled bitmap");
1393 if (!isMutable()) {
1394 throw new IllegalStateException();
1395 }
1396 checkPixelAccess(x, y);
1397 nativeSetPixel(mNativeBitmap, x, y, color, mIsPremultiplied);
1398 }
因此,我使用不同的数值运行setPixel(0,0),从对setPixel(0,1)正常工作的数值开始。
首先,我仅更改了其中一个参数。结论是alpha值是罪魁祸首,但不确定具体原因。我尝试了许多其他alpha值,似乎在大约0xB0及以上的值时结果会返回OK。
我在其他像素上尝试了相同的值,问题并不取决于像素坐标,对于其他像素也会失败。该问题似乎与数据有关。
source.setPixel(0, 0, Color.argb(0x40, 0x1A, 0x11, 0x12));
int sp00 = source.getPixel(0, 0); // sp00 1075580948 [0x401c1014] BAD
source.setPixel(0, 0, Color.argb(0xFE, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -16781602 [0xfeffeede] OK!
source.setPixel(0, 0, Color.argb(0x40, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 1090514911 [0x40ffefdf] BAD
source.setPixel(0, 0, Color.argb(0xFE, 0x1A, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -31789346 [0xfe1aeede] OK!
source.setPixel(0, 0, Color.argb(0xFE, 0xFF, 0x11, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -16838178 [0xfeff11de] OK!
source.setPixel(0, 0, Color.argb(0xFE, 0xFF, 0xEE, 0x12));
sp00 = source.getPixel(0, 0); // sp00 -16781806 [0xfeffee12] OK!
source.setPixel(0, 0, Color.argb(0x00, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 0 [0x0] Strange, why Color has to police the alpha value?
source.setPixel(0, 0, Color.argb(0x10, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 285208543 [0x10ffefdf] BAD
source.setPixel(0, 0, Color.argb(0x20, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 553643999 [0x20ffefdf] BAD
source.setPixel(0, 0, Color.argb(0x30, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 822079455 [0x30ffefdf] BAD
source.setPixel(0, 0, Color.argb(0x50, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 1358950367 [0x50ffefdf] BAD
source.setPixel(0, 0, Color.argb(0x60, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 1627385823 [0x60ffefdf] BAD
source.setPixel(0, 0, Color.argb(0x70, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 1895821279 [0x70ffefdf] BAD
source.setPixel(0, 0, Color.argb(0x80, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -2130711075 [0x80ffeddd] BAD but change of pattern
source.setPixel(0, 0, Color.argb(0x90, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1862275619 [0x90ffeddd] BAD
source.setPixel(0, 0, Color.argb(0xA0, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1593840162 [0xa0ffedde] BAD but change of pattern again
source.setPixel(0, 0, Color.argb(0xB0, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1325404450 [0xb0ffeede] OK!
source.setPixel(0, 0, Color.argb(0xC0, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1056968994 [0xc0ffeede] OK!
source.setPixel(0, 0, Color.argb(0xD0, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -788533538 [0xd0ffeede] OK!
source.setPixel(0, 0, Color.argb(0xE0, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -520098082 [0xe0ffeede] OK!
source.setPixel(0, 0, Color.argb(0xF0, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -251662626 [0xf0ffeede] OK!
source.setPixel(0, 0, Color.argb(0xA7, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1476399395 [0xa7ffeedd] BAD
source.setPixel(0, 0, Color.argb(0xA3, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1543508258 [0xa3ffeede] OK!
source.setPixel(0, 0, Color.argb(0xA1, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1577062690 [0xa1ffeede] OK!
source.setPixel(0, 0, Color.argb(0xAB, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1409290274 [0xabffefde] BAD
source.setPixel(0, 0, Color.argb(0xA9, 0xFF, 0xEE, 0xDE));
sp00 = source.getPixel(0, 0); // sp00 -1442844962 [0xa9ffeede] OK!
Bitmap.createBitmap
的文档: "返回一个指定宽度和高度的可变位图。" @donfuxx - ilomambo