`
ranlic
  • 浏览: 46713 次
社区版块
存档分类
最新评论

BitmapPixels示例中AGRB_8888疑问

 
阅读更多

  在本示例中遇到一个问题,无法解决,记录于此~~

 

  在示例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位图 不是同一种格式?  还是数据存储时的原因? 

 

本例运行截图如下:


 

源码如下在附件处

 

 

  • 大小: 266.6 KB
分享到:
评论
1 楼 jhondge 2013-03-14  
因为Skia库 接收的是ABGR 格式 因此需要转换。

相关推荐

Global site tag (gtag.js) - Google Analytics