Android bitmap保姆级教学

本文详细介绍了Android中Bitmap的使用,包括Bitmap的创建方式,如通过BitmapFactory.decodeStream()、decodeFile()、decodeResource()、decodeByteArray()等,以及从bitmapDrawable获取。此外,还讲解了Bitmap的颜色配置、压缩方式、图像操作如裁剪、缩放、旋转,并探讨了防止OOM的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 认识Bitmap

Bitmap是一个final类,因此不能被继承。Bitmap只有一个构造方法,且该构造方法是没有任何访问权限修饰符修饰,也就是说该构造方法是friendly,但是谷歌称Bitmap的构造方法是private(私有的),感觉有点不严谨。不管怎样,一般情况下,我们不能通过构造方法直接新建一个Bitmap对象。
Bitmap是Android系统中的图像处理中最重要类之一。Bitmap可以获取图像文件信息,对图像进行剪切、旋转、缩放,压缩等操作,并可以以指定格式保存图像文件。

2. 创建Bitmap对象

既然不能直接通过构造方法创建Bitmap,那怎样才能创建Bitmap对象。通常我们可以利用Bitmap的静态方法createBitmap()和BitmapFactory的decode系列静态方法创建Bitmap对象。

  • Bitmap的静态方法createBitmap()
    createBitmap

  • BitmapFactory的decode系列静态方法
    bitmapFactory

2.1. 流——BitmapFactory.decodeStream()

(1) 文件流

FileInputStream fis = new FileInputStream("/sdcard/test.png"); 
Bitmap bitmap=BitmapFactory.decodeStream(fis);

(2) 以ResourceStream的方式代替R文件

Bitmap bitmap=BitmapFactory.decodeStream(
    getClass().getResourceAsStream(/res/drawable/test.png”));

(3) 以文件流+ R文件 的方式

InputStream in = getResources().openRawResource(R.drawable. test );
Bitmap bitmap = BitmapFactory.decodeStream(in);

(4) 图片放在src目录下

String path = "com/xiangmu/test.png"; //图片存放的路径
InputStream in = getClassLoader().getResourceAsStream(path); //得到图片流
Bitmap imageBitmap3 = BitmapFactory.decodeStream(in);

(5) 图片放在 Assets目录

InputStream in = getResources().getAssets().open(fileName);
Bitmap imageBitmap4 = BitmapFactory.decodeStream(in);

2.2. 文件路径——BitmapFactory.decodeFile()

Bitmap imageBitmap = BitmapFactory.decodeFile(path);// (path 是图片的路径,跟目录是/sdcard)

支持的文件格式:

2.3. 资源ID——BitmapFactory.decodeResource()

(1) 以R文件的方式

// 假设 res/drawable下有 test.jpg文件
Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.test);

(2) 获取制定packageName的资源文件

ApplicationInfo appInfo = getApplicationInfo();
//得到该图片的id(name 是该图片的名字,"drawable" 是该图片存放的目录,appInfo.packageName是应用程序的包)
int resID = getResources().getIdentifier(fileName, "drawable", appInfo.packageName);
Bitmap imageBitmap2 = BitmapFactory.decodeResource(getResources(), resID);

2.4. 字节数组——BitmapFactory.decodeByteArray()

(1) bmp格式的数组

byte[] bmpBytes = readFileToByteArray(bmpPath);// bmp文件格式
Bitmap bitmap = BitmapFactory.decodeByteArray(bmpBytes, 0, bmpBytes.length);

(2) yuv-nv21/jpg格式的数组

//data可以是jpg格式的数组
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//yuv格式的byte[]转换成bitmap
public static Bitmap nv21ToBitmap(byte[] nv21, int width, int height) {
      
    Bitmap bitmap = null;
    try {
   
        YuvImage image = new YuvImage(nv21, ImageFormat.NV21, width, height, null);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        image.compressToJpeg(new Rect(0, 0, width, height), 80
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值