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

一、前言

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

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值