- 在进行Xamarin开发时,因需要用到RGBA格式,而Mono.Android.Bitmap.Config中只有Argb8888。
- Argb8888按照字面意思好像是按照A、R、G、B顺序排列像素通道,但是在查阅了网上一些模糊的说法后,我发现并没有那么简单。
- 有一篇Android/Java开发博客中验证了在java库中Argb8888格式的ARGB顺序为R、G、B、A,而Mono for Android API又是映射标准的Andriod API(如下所示),理论上来说两者的Argb8888格式应该是相同的。
ARGB_8888
Added in API level 1
enum val ARGB_8888 : Bitmap.Config
Each pixel is stored on 4 bytes. Each channel (RGB and alpha for translucency) is stored with
8 bits of precision (256 possible values.) This configuration is very flexible and offers the
best quality. It should be used whenever possible.
Use this formula to pack into 32 bits:
int color = (A & 0xff) << 24 | (B & 0xff) << 16 | (G & 0xff) << 8 | (R & 0xff);
- 但是俗话说眼见为实,因此我决定再去验证一下Mono.Android Bitmap Argb8888的实际顺序,项目步骤如下:
(1)创建一个带Android平台的Xamarin.Forms项目;
(2)在xaml文件中添加一个Button组件,这里命名为“btnARGBTest”,为其创建一个名为“btnARGBTest_Clicked”的点击事件;
(3)在点击事件中添加下列代码,调试结果如代码中的注释所示。
注:每当点击Button时,Debug.WriteLine()方法就会在输出信息框里输出相应信息。
private void btnARGBTest_Clicked(object sender, EventArgs e)
{
Bitmap bmpARGB = Bitmap.CreateBitmap(3, 3, Bitmap.Config.Argb8888);
bmpARGB.SetPixel(0, 0, Android.Graphics.Color.Red);
bmpARGB.SetPixel(0, 1, Android.Graphics.Color.Green);
bmpARGB.SetPixel(0, 2, Android.Graphics.Color.Blue);
Debug.WriteLine("Red:{0}", bmpARGB.GetColor(0,0));
//输出-Red:Color(1.0, 0.0, 0.0, 1.0, sRGB IEC61966-2.1)
Debug.WriteLine("Green:{0}", bmpARGB.GetColor(0, 1));
//输出-Green:Color(0.0, 1.0, 0.0, 1.0, sRGB IEC61966-2.1)
Debug.WriteLine("Blue:{0}", bmpARGB.GetColor(0, 2));
//输出-Blue:Color(0.0, 0.0, 1.0, 1.0, sRGB IEC61966-2.1)
//注:猜测这里A应该是默认成不透明,所以归一化值为1.0
}
最后结果列表如下所示,故可得出ARGB8888格式顺序为RGBA。
------R G B A
--Red:1 0 0 1
Green:0 1 0 1
-Blue:0 0 1 1