如何知道一张图片占用内存的大小呢?
bitmap的大小= 图片长度 x 图片宽度 x 一个像素点占用的字节数
质量压缩:通过算法用什么来代替一个像素, 不影响 bitmap的大小那么,图片的长,宽,像素都不变,那么bitmap所占内存大小是不会变的
图片的大小计算
色彩模型: RGB模型 一个 R越接近255说明红色光线越强 只能用于发光体
如果是反光体则用CMYK 色彩模型。因为一个反射体他能展示颜色的原因是:红色物体显示红色的原因是因为他反射红色,所以我们看到的是红色,吸收了其他颜色。
2、Bitmap.Config.ARGB_4444 表示一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites共16bites,即2个字节
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位 [4] 。一个像素所占用的二进制数叫做色深。比如:RGB_4444 这种图片的色深是 16bit。
jpn和png保存到磁盘中已经是一种压缩算法
数据的存储是以字节(byte)为单位的。数据的传输以位为单位的,一个位就代表0或者1 (即二进制) ,每8个位为一个字节
https://blog.csdn.net/luoshaoyun/article/details/53422664
图片的压缩:
1.质量压缩,改变的是图片在磁盘中的大小
private void compress(Bitmap bitmap){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,60,bos);
//bos 写入磁盘的缓冲输入流
//qualit指定压缩质量
//CompressFormat指定图片的格式
}
2。下采样率压缩(减小图片的宽高):改变的是图片在磁盘和内存中的大小
//按压缩比是压缩,限制图片的最大宽高
private Bitmap comPressSize(Bitmap beforBitmap, double maxWidth, double maxHeight){
int beforeHeight = beforBitmap.getHeight();
int beforeWidth = beforBitmap.getWidth();
if (beforeWidth <= maxWidth && beforeHeight <= maxHeight) {
return beforBitmap;
}
//设置等比缩放
float scaleWidth = ((float) maxWidth) / beforeWidth;
float scaleHeight = ((float)maxHeight) / beforeHeight;
float scale = scaleWidth;
if (scaleWidth > scaleHeight) {
scale = scaleHeight;
}
// 矩阵对象
Matrix matrix = new Matrix();
// 缩放图片动作 缩放比例
matrix.postScale(scale, scale);
Bitmap bitmap = Bitmap.createBitmap(beforBitmap, 0, 0,
(int) beforeWidth, (int) beforeHeight, matrix, true);
return bitmap;
}
如何改变图片在内存中的大小:
bitmap的大小= 图片长度 x 图片宽度 x 一个像素点占用的字节数
android中内存的每个像素点是由色彩模型ARGB值确定下来。
色彩模型值有:
Bitmap.Config是Bitmap的一个枚举内部类,它表示的就是每个像素点对ARGB通道值的存储方案。取值有以下四种:
ALPHA_8:每个像素占8位(1个字节),存储透明度信息,没有颜色信息。
RGB_565:没有透明度,R=5,G=6,B=5,,那么一个像素点占5+6+5=16位(2字节),能表示2^16种颜色。
ARGB_4444:由4个4位组成,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 (2字节),能表示2^16种颜色。
ARGB_8888:由4个8位组成,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位(4字节),能表示2^24种颜色。
所以改变bitmap在内存中的大小,有两种方式:一个是改变图片的大小,第二个是改变bitmap的色彩模型。
最详细的Android图片压缩攻略_Android技术之家的博客-CSDN博客
色深和位深的区别:
这个纠结好久了,其实他两 是一个概念,只是从不同的方向描叙同一个概念
1.位深度指的是存储每个像素所用的位数,主要用于存储磁盘方面
2.色深是指每个像素点用多少位数来表示。位数越多,色彩越丰富
举个例子:
100像素*100像素 色深32位(ARGB_8888) 保存时位深度为24位 的图片
在内存中所占大小为:100 * 100 * (32 / 8)Byte
在文件中所占大小为 100 * 100 * ( 24/ 8 ) * 压缩效率 Byte //一般保存的时候都有压缩率,所以这个别忘记乘了。
android 如何将内存中的Bitmap转成磁盘中的图片呢?
bitmap.compress(Bitmap.CompressFormat.PNG,60,null)
发现android 没有提供修改位深的。
android默认的://这是chatGPT回答的,可能不对
JPEG:支持24位色深,即每个像素由8位红色,8位绿色和8位蓝色组成。
- PNG:支持32位色深,即每个像素由8位红色,8位绿色,8位蓝色和8位alpha(透明度)组成。
- WEBP:支持24位和32位色深,具体取决于图片是否包含alpha通道。