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

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

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

通用裁图逻辑:

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cbow模型详解_drude模型的三个基本假设

    cbow模型详解_drude模型的三个基本假设初始化:初始化方法的参数包括词汇个数vocab_size和中间层的神经元个数hidden_size。首先生成两个权重(W_in和W_out),并用一些小的随机值初始化这两个权重。设置astype(‘f’),初始化将使用32位的浮点数。生成层:生成两个输入侧的MatMul层、一个输出侧的MatMul层,以及一个SoftmaxwithLoss层。保存权重和梯度:将该神经网络中使用的权重参数和梯度分别保存在列表类型的成员变量params和grads中。正向传播for.

    2025年9月27日
    3
  • python中文件的写入_python列表写入txt文件

    python中文件的写入_python列表写入txt文件1.自己写入txt直接上核心代码:withopen(“douban.txt”,”w”)asf:f.write(“这是个测试!”)12这句话自带文件关闭功能,所以和那些先open再write再close的方式来说,更加pythontic!结果就是这样:2.将文件输入(print)的内容写入txt我并不喜欢手写字符,更多时候用到的就是将程序跑出来的print写到txt中保存,比如

    2022年10月2日
    3
  • FFmpeg从入门到精通(一)

    FFmpeg从入门到精通(一)FFmpeg介绍FFmpeg既是一种音视频编解码工具,也是一组音视频解码开发套件。作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。FFmpeg基本组成先看图,再看字。FFmpeg的封装模块AVFormatAVFormat中实现了目前多媒体领域中大多数媒体封装格式,包括封装和解封装,如:MP4,FLV等文件封装格式、HTTP,RTMP,HLS等网络协议封装格式。FFm…

    2022年6月26日
    19
  • ThinkPHP3.2版本安全更新

    ThinkPHP3.2版本安全更新

    2021年10月18日
    49
  • Python之xpath

    xpath表达式格式xpath通过"路径表达式"来选择节点,在表现形式上与传统的文件系统类似绝对路径(absolutepath)必须用"/"起首,后面紧跟

    2021年12月18日
    52
  • 键盘记录器,可截获到 QQ 的密码「建议收藏」

    键盘记录器,可截获到 QQ 的密码「建议收藏」虽然QQ 的密码框经过了特殊的处理,但是通过一些特殊手段仍然可以得到输入过程中键盘输入的内容。代码仅供娱乐使用!

    2022年7月20日
    18

发表回复

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

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