android 复制bitmap_Android Bitmap知识梳理学习

学习资料:

android 开发艺术探索

1.关于 Bitmap

在Android中Bitamp指的就是一张图片,一般是png和jpeg格式。

Bitmap类中有一个enum类型的Config,其中有4个值

ALPHA_8

8位位图;1 个字节,只有透明度,没有颜色值

RGB_565

16位位图;2 个字节,r = 5,g = 6,b = 5,一个像素点 5+6+5 = 16

ARGB_4444

16位位图;2 个字节,a = 4,r = 4,g = 4,b = 4,一个像素点 4+4+4+4 = 16

ARGB_8888

32 位位图; 4个字节,a = 8,r = 8,g = 8, b = 8,一个像素点 8 + 8 + 8 + 8 = 32

每8位一个字节

并不理解a,r,g,b对像素的影响,主要了解一下,不同的类型格式,占用内存情况

一张 1024 * 1024 像素,采用ARGB8888格式,一个像素32位,每个像素就是4字节,占有内存就是4M

若采用RGB565,一个像素16位,每个像素就是2字节,占有内存就是2M

Glide加载图片默认格式RGB565,Picasso为ARGB8888,默认情况下,Glide占用内存会比Picasso低,色彩不如Picasso鲜艳,自然清晰度就低

BitmaFactory

Creates Bitmap objects from various sources, including files, streams, and byte-arrays.

通过BitmapFactory从文件系统,资源,输入流,字节数组中加载得到一个Bitmap对象。

decodeByteArray()

decodeFile()

decodeResource()

decodeStream()

decodeFileDescriptor()

decodeResourceStream()

BitmapFactory所有public method都是静态方法。一共也就6个方法,后两个用的几率不如前4个高 :)

2.Bitmap 的高效加载

核心思想: 利用BitmapFactory.Options来加载实际所需的尺寸

2.1 BitmapFactory.Options

这个类中只有一个方法requestCancelDecode(),剩下全是一些常量值

BitmapFactory.Options缩放图片主要用到inSample采样率

inSample = 1,采样后图片的宽高为原始宽高

inSample > 1,例如2,宽高均为原图的宽高的1/2

一个采用ARGB8888的1024 * 1024 的图片

inSample = 1,占用内存就 1024 * 1024 * 4 = 4M

inSample = 2,占用内存就 512 * 512 * 4 = 1M

缩小规律就是:1 /(inSample ^ 2)

inSample的值最小为1,低于1时无效的。inSample的值最好为2,4,8,16,2的指数。在某些时候,系统会向下取整,例如为3时,系统会用2来代替。2 的指数,可以一定程度上避免图片拉伸变形。

2.2 获取采样率的流程

以读取资源文件为例:

创建BitmapFactory.Options对象options

将options的inJustDecodeBounds参数设为true,然后使用BitmapFactory.decodeResource(res,resId,options)加载图片

利用options取出图片的原始宽高信息,outWidth,outHeight

根据采样率的规则并结合实际需要显示的宽高计算出inSample

将options的inJustDecodeBounds参数设为false,并再次使用BitmapFactory.decodeResource(res,resId,options)返回采样后的Bitmap

inJustDecodeBounds设为true,BitmapFactory只会解析图片的原始信息,并不会真正的加载图片

BitmapFactory读取图片的宽高的信息受图片所在drawable文件夹和设备屏幕本身的像素密度影响。

2.3 压缩图片简单实践

直接百度了一张imac的5k分辨率5120 * 2880大小为5.97M的壁纸,直接加载我的手机百分百会出现oom

效果

java代码:

public class MainA

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值