图片压缩算法「建议收藏」

图片压缩算法「建议收藏」图片压缩算法

大家好,又见面了,我是你们的朋友全栈君。

通用裁图逻辑:

第一:我们先看下质量压缩方法:

private Bitmap compressImage(Bitmap image) {  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    //质量压缩方法,这里100表示不压缩,把压缩后的数据存入baos中 
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    int options = 100;  
    while ( baos.size() / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩 
        baos.reset();//重置baos即清空baos 
        image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 
        options -= 10;//每次都减少10 
    }  
    //把压缩后的数据baos存放到ByteArrayInputStream中 
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
    //把ByteArrayInputStream数据生成图片 
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
    return bitmap;  
}  

第二:图片按比例大小压缩方法(根据路径获取图片并压缩):

private Bitmap getimage(String srcPath) {  
    BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    //开始读入图片,把options.inJustDecodeBounds 设回true了 
    newOpts.inJustDecodeBounds = true;  
    //此时返回bm为空 
    Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);
    newOpts.inJustDecodeBounds = false;  
    int w = newOpts.outWidth;  
    int h = newOpts.outHeight;  
    //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 
    float hh = 800f;//这里设置高度为800f 
    float ww = 480f;//这里设置宽度为480f 
    //缩放比,当前固定比例缩放,只用高或者宽其中一个数据计算即可 
    int be = 1;//be=1表示不缩放 
    //如果宽度大的话根据宽度固定大小缩放 
    if (w > h && w > ww) {
        be = (int) (newOpts.outWidth / ww); 
    //如果高度高的话根据宽度固定大小缩放 
    } else if (w < h && h > hh) {
        be = (int) (newOpts.outHeight / hh);  
    }  
    if (be <= 0)  
        be = 1;  
    newOpts.inSampleSize = be; //设置缩放比例 
    //重新读入图片,把options.inJustDecodeBounds设回false了 
    bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
    return compressImage(bitmap);//压缩比例后进行质量压缩 
}  

第三:图片按比例大小压缩方法(根据Bitmap图片压缩):

private Bitmap comp(Bitmap image) {  
      
    ByteArrayOutputStream baos = new ByteArrayOutputStream();         
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
    //判断如果图片大于1M,进行压缩避免在生成图片时溢出 
    if( bass.size() / 1024>1024) {   
        baos.reset();    //重置baos即清空baos 
        image.compress(Bitmap.CompressFormat.JPEG, 50, baos);   //这里压缩50%,把压缩后的数据存放到baos中 
    }  
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
    BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    //开始读入图片,把options.inJustDecodeBounds 设回true了 
    newOpts.inJustDecodeBounds = true;  
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    newOpts.inJustDecodeBounds = false;  
    int w = newOpts.outWidth;  
    int h = newOpts.outHeight;  
    //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 
    float hh = 800f;//这里设置高度为800f 
    float ww = 480f;//这里设置宽度为480f 
    //缩放比,当前固定比例缩放,只用高或者宽其中一个数据计算即可 
    int be = 1;   //be=1表示不缩放 
    // 如果宽度大的话根据宽度固定大小缩放 
    if (w > h && w > ww) {
        be = (int) (newOpts.outWidth / ww);  
    //如果高度高的话根据宽度固定大小缩放 z 
    } else if (w < h && h > hh) {
        be = (int) (newOpts.outHeight / hh);  
    }  
    if (be <= 0)  
        be = 1;  
    newOpts.inSampleSize = be;//设置缩放比例 
    //重新读入图片,把options.inJustDecodeBounds设回false了 
    isBm = new ByteArrayInputStream(baos.toByteArray());  
    bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    return compressImage(bitmap);//压缩比例后进行质量压缩 
}  

常用简单方法:

  • 上面的几种方法是以字节流的方式裁剪图片。现在,再来看一种简单的裁剪方法,这个裁剪方法是通过Bitmap的创建功能来截取原图的部分数据:
 /** 图片裁剪:按指定大小裁剪 */
public Bitmap tailorImageByImgs(String srcPath, int hh, int ww) {
    BitmapFactory.Options newOpts = new BitmapFactory.Options();
    Bitmap bitmap = BitmapFactory.decodeFile(srcPath);

    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    int retX = w > ww ? (w - ww) / 2 : 0;//基于原图,取正方形左上角x坐标
    int retY = h > hh ? (h - hh) / 2 : 0;

    //下面这句是关键
    return Bitmap.createBitmap(bitmap, retX, retY, hh, ww, null, false);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150562.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rabbitmq集群搭建_rabbitmq创建队列

    rabbitmq集群搭建_rabbitmq创建队列一普通集群以如下两台服务器为例ip:172.16.9.8hostname:rabbitmq1(master)ip:172.16.9.9hostname:rabbitmq2(slave)1.修改host文件编辑/etc/hosts文件,添加172.16.9.8rabbitmq1172.16.9.9rabbitmq22.复制cookie内容打开文件然后需要先把172.16.9.8服务器的/var/lib/rabbitmq/.erla…

    2025年10月23日
    3
  • 多种方法彻底解决pycharm中: OSError: [WinError 1455] 页面文件太小,无法完成操作 的问题

    多种方法彻底解决pycharm中: OSError: [WinError 1455] 页面文件太小,无法完成操作 的问题目录1.重启pycharm(基本没啥用)2.把num_works设置为0(可能也没啥用)3.调大页面文件的大小(彻底解决问题)相信很多小伙伴在使用pycharm的时候都遇到这个问个报错问题吧,我是在跑PyTorch相关代码遇到的这个问题,也搜索了很多解决办法,这里介绍下我总结的经验.这是我搜索到的三种解决方法,依次来介绍下:1.重启pycharm(基本没啥用)这是最简单的方法了,可以先尝试一下,反正也很简单,不过如果你是第一次遇到这个问题,基本是解…

    2022年6月24日
    410
  • 游戏服务器架构演化史pdf_分布式游戏服务器

    游戏服务器架构演化史pdf_分布式游戏服务器类型1:卡牌、跑酷等弱交互服务端卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的HTTP服务器:登录时可以使用非对称加密(RSA,DH),服务器根据客户端uid,当前时间戳还有服务端私钥,计算哈希得到的加密key并发送给客户端。之后双方都用HTTP通信,并用那个key进行RC4加密。客户端收到key和时间

    2022年10月21日
    3
  • 疫后本地生活踏入拐点,全面升级的饿了么助力身边经济

    疫后本地生活踏入拐点,全面升级的饿了么助力身边经济7月10日饿了么宣布全面升级,从餐饮外卖平台转变为解决用户身边一切即时需求的生活服务平台,并将在未来大力布局“身边经济”,打造应有尽有的生活圈。眼下,整个经济正在迎来疫情后的反弹复苏,以餐饮、生鲜、零售为代表的消费行业加速反弹,饿了么在此时宣布全面升级,可谓顺势而为,在笔者看来,此次全面升级,有两大看点。在后疫情时代,饿了么从餐饮外卖平台转型同城生活服务,也将对整个本地生活服务会产生深刻的影响。看点1:饿了么为什么在此时宣布全面升级?在零售的战场上,时机和火候往往决定一切。饿了么此次..

    2022年6月22日
    51
  • python不换行输出

    python不换行输出#!/usr/bin/envpython#-*-coding=utf-8-*-'''Createdon2018年6月24日@author:sairo&#3

    2022年7月6日
    23
  • python批量生成测试用例_根据接口文档生成测试用例

    python批量生成测试用例_根据接口文档生成测试用例前言写用例之前,我们应该熟悉API的详细信息。建议使用抓包工具Charles或AnyProxy进行抓包。har2case我们先来了解一下另一个项目har2case他的工作原理就是将当前主流的抓

    2022年7月30日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号