图片压缩(7)

如何知道一张图片占用内存的大小呢?


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通道。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值