你真的知道 ARGB_8888 格式图片的 A、R、G、B 每个通道的排列顺序吗?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/afei__/article/details/81415286

一、前言

Android 开发中经常使用到 Bitmap,而 Bitmap 的默认加载个格式为 ARGB_8888 。而关于 ARGB_8888 的介绍,网上基本都是只说明 ARGB_8888 格式每个像素占 4 个字节,每个通道(A:alpha,R:red,G:green,B:blue)有 8 位,可以表示 0-255 个值。
但是,你是否知道它内部每个通道的排列顺序吗?是 A-R-G-B 这样依次排列还是别的排列方式呢?

 

二、实验和证明

1. 准备工作

  • 首先创建一张指定颜色的图片
  • 再获取到 Bitmap 的像素信息,最后打印出来其各通道值。

 

2. 编写代码

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

import java.nio.Buffer;
import java.nio.ByteBuffer;

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";
    private ImageView displayIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
        bitmap.eraseColor(0xff336699); // AARRGGBB
        byte[] bytes = new byte[bitmap.getWidth() * bitmap.getHeight() * 4];
        Buffer dst = ByteBuffer.wrap(bytes);
        bitmap.copyPixelsToBuffer(dst);
        // ARGB_8888 真实的存储顺序是 R-G-B-A
        Log.d(TAG, "R: " + Integer.toHexString(bytes[0] & 0xff));
        Log.d(TAG, "G: " + Integer.toHexString(bytes[1] & 0xff));
        Log.d(TAG, "B: " + Integer.toHexString(bytes[2] & 0xff));
        Log.d(TAG, "A: " + Integer.toHexString(bytes[3] & 0xff));
        displayIv = (ImageView) findViewById(R.id.display_iv);
        displayIv.setImageBitmap(bitmap);
    }

}

 

3. 运行代码

 

4. 结论

通过实践,我们可以得知,ARGB_8888 格式图片的各通道顺序其实不是 ARGB,而是 RGBA

猜你喜欢

转载自blog.csdn.net/afei__/article/details/81415286
今日推荐