在本示例中遇到一个问题,无法解决,记录于此~~
在示例BitmapPixels中,为了获取不同格式(AGRB_8888, ARGB_565, ARGB4444)下的颜色值,先将目标颜色的三个基色和alpha值分别取出,如下代码所示:
int r = Color.red(c); int g = Color.green(c); int b = Color.blue(c); int a = Color.alpha(c);
然后依据算法将三基色及alpha值计算,获得相应数值,如下代码所示:
r = mul255(r, a); g = mul255(g, a); b = mul255(b, a);
其中int mul() 定义如下:
private static int mul255(int c, int a){ int prod = c * a + 128; return (prod + (prod >> 8)) >> 8; }
然后将运算后的三基色及alpha值封装回颜色整值,如下代码所示:
return pack8888(r, g, b, a);
其中,int pack8888() 方法定义如下:
private static int pack8888(int r, int g, int b, int a){ return (r << 0)|(g << 8)|(b << 16)|(a << 24); }这里就产生这样一个问题: 为何要将 ARGB 颜色格式转换为 ABGR???
在这以后的代码中无论分取颜色阶梯,还是构造Buffer,构造Bitmap,都没有涉及到颜色模式的改变,在构造Buffer前使用 Log.d() 日志方法获取的 data8888[0] (即第一张图左上角像素值) 仍为 -16776961 , 该数值在android.graphics.Color 类中为
public static final int BLUE
Constant Value: -16776961 (0xff0000ff)
这就难理解了,为什么 Bitmap.Config.ARGB_8888 能将int值为 -16776961的值显示为红色,而不是蓝色???难道这里 ARGB_8888 与 ARGB 32位图 不是同一种格式? 还是数据存储时的原因?
本例运行截图如下:
源码如下在附件处