zoukankan      html  css  js  c++  java
  • Android中图片压缩(质量压缩和尺寸压缩)

    关于Android 图片压缩的学习:

    自己总结分为质量压缩和像素压缩。质量压缩即:将Bitmap对象保存到对应路径下是所占用的内存减小,但是当你重新读取压缩后的file为Bitmap时,它所占用的内存并没有改变,它会改变其图像的位深和每个像素的透明度,也就是说JPEG格式压缩后,原来图片中透明的元素将消失,所以这种格式很可能造成失真。像素压缩:将Bitmap对象的像素点通过设置采样率,减少Bitmap的像素点,减小占用内存。两种压缩均可能对图片清晰度造成影响。

    (一)

    /**
    *
    * @description 将图片保存到本地时进行压缩, 即将图片从Bitmap形式变为File形式时进行压缩,
    * 特点是: File形式的图片确实被压缩了, 但是当你重新读取压缩后的file为 Bitmap是,它占用的内存并没有改变
    * 所谓的质量压缩,即为改变其图像的位深和每个像素的透明度,也就是说JPEG格式压缩后,原来图片中透明的元素将消失,所以这种格式很可能造成失真
    * @date 2015年8月25日
    * @param bmp
    * @param file
    */
    public static void compressBmpToFile(Bitmap bmp,File file) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int options = 80;
    bmp.compress(CompressFormat.JPEG, options, baos);
    while(baos.toByteArray().length/1024 > 100){
    baos.reset();
    options -= 10;
    bmp.compress(Bitmap.CompressFormat.JPEG, options,baos);
    }
    try {
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(baos.toByteArray());
    fos.flush();
    fos.close();
    }
    catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }

      
    (二)

    /**
    *
    * @description 将图片从本地读到内存时,即图片从File形式变为Bitmap形式
    * 特点:通过设置采样率,减少图片的像素,达到对内存中的Bitmao进行压缩
    方法说明: 该方法就是对Bitmap形式的图片进行压缩, 也就是通过设置采样率, 减少Bitmap的像素, 从而减少了它所占用的内存
    * @date 2015年8月25日
    * @param image
    * @return
    */
    private Bitmap compressBmpFromBmp(String srcPath){
    BitmapFactory.Options newOptions = new BitmapFactory.Options();
    newOptions.inJustDecodeBounds = true;//只读边,不读内容
    Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOptions);

    newOptions.inJustDecodeBounds = false;
    int w = newOptions.outWidth;
    int h = newOptions.outHeight;
    float hh = 800f;
    float ww = 480f;
    int be = 1;
    if(w > h && w >ww){
    be = (int)(newOptions.outWidth/ww);
    }else if (w < h && h > hh) {
    be = (int)(newOptions.outHeight/hh);
    }
    if(be <= 0)
    be = 1;
    newOptions.inSampleSize = be;//设置采样率
    newOptions.inPreferredConfig = Config.ARGB_8888;//该模式是默认的,可不设
    newOptions.inPurgeable = true;//同时设置才会有效
    newOptions.inInputShareable = true;//当系统内存不够时候图片会自动被回收

    bitmap = BitmapFactory.decodeFile(srcPath, newOptions);
    return bitmap;

    }

  • 相关阅读:
    Redux
    React-Router常见API
    webpack的plugin原理
    Kubernetes核心原理笔记
    阿里云证书过期时间监测
    DRF
    一个TCP可以发送多少个请求
    jenkins exporter(收集jenkins构建结果)
    Kubernetes SDN
    Django REST framework API认证(包括JWT认证)
  • 原文地址:https://www.cnblogs.com/yuanting/p/4758125.html
Copyright © 2011-2022 走看看