我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android图片压缩(质量压缩和尺寸压缩)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图。

两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了。下面这个博客说的比较清晰:

android图片压缩总结

总 结来看,图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap,所谓的质量压缩,它其实只能实现对 file的影响,你可以把一个file转成bitmap再转成file,或者直接将一个bitmap转成file时,这个最终的file是被压缩过的,但 是中间的bitmap并没有被压缩(或者说几乎没有被压缩,我不确定),因为bigmap在内存中的大小是按像素计算的,也就是width * height,对于质量压缩,并不会改变图片的像素,所以就算质量被压缩了,但是bitmap在内存的占有率还是没变小,但你做成file时,它确实变小 了;

而尺寸压缩由于是减小了图片的像素,所以它直接对bitmap产生了影响,当然最终的file也是相对的变小了;

最后把自己总结的工具类贴出来:

import javaioByteArrayInputStream; import javaioByteArrayOutputStream; import javaioFile; import javaioFileNotFoundException; import javaioFileOutputStream; import javaioIOException;  import androidgraphicsBitmap; import androidgraphicsBitmapConfig; import androidgraphicsBitmapFactory;   public class ImageFactory {       public Bitmap getBitmap(String imgPath) {     // Get bitmap through image path     BitmapFactoryOptions newOpts = new BitmapFactoryOptions();     newOptsinJustDecodeBounds = false;     newOptsinPurgeable = true;     newOptsinInputShareable = true;     // Do not compress     newOptsinSampleSize = 1;     newOptsinPreferredConfig = ConfigRGB_565;     return BitmapFactorydecodeFile(imgPath, newOpts);   }         public void storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException {     FileOutputStream os = new FileOutputStream(outPath);     bitmapcompress(BitmapCompressFormatJPEG, 100, os);   }         public Bitmap ratio(String imgPath, float pixelW, float pixelH) {     BitmapFactoryOptions newOpts = new BitmapFactoryOptions();      // 开始读入图片,此时把optionsinJustDecodeBounds 设回true,即只读边不读内容     newOptsinJustDecodeBounds = true;     newOptsinPreferredConfig = ConfigRGB_565;     // Get bitmap info, but notice that bitmap is null now      Bitmap bitmap = BitmapFactorydecodeFile(imgPath,newOpts);           newOptsinJustDecodeBounds = false;      int w = newOptsoutWidth;      int h = newOptsoutHeight;      // 想要缩放的目标尺寸     float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了     float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了     // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可      int be = 1;//be=1表示不缩放      if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放        be = (int) (newOptsoutWidth / ww);      } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放        be = (int) (newOptsoutHeight / hh);      }      if (be <= 0) be = 1;      newOptsinSampleSize = be;//设置缩放比例     // 开始压缩图片,注意此时已经把optionsinJustDecodeBounds 设回false了     bitmap = BitmapFactorydecodeFile(imgPath, newOpts);     // 压缩好比例大小后再进行质量压缩 //    return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除     return bitmap;   }         public Bitmap ratio(Bitmap image, float pixelW, float pixelH) {     ByteArrayOutputStream os = new ByteArrayOutputStream();     imagecompress(BitmapCompressFormatJPEG, 100, os);     if( ostoByteArray()length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactorydecodeStream)时溢出         osreset();//重置baos即清空baos        imagecompress(BitmapCompressFormatJPEG, 50, os);//这里压缩50%,把压缩后的数据存放到baos中      }      ByteArrayInputStream is = new ByteArrayInputStream(ostoByteArray());      BitmapFactoryOptions newOpts = new BitmapFactoryOptions();      //开始读入图片,此时把optionsinJustDecodeBounds 设回true了      newOptsinJustDecodeBounds = true;     newOptsinPreferredConfig = ConfigRGB_565;     Bitmap bitmap = BitmapFactorydecodeStream(is, null, newOpts);      newOptsinJustDecodeBounds = false;      int w = newOptsoutWidth;      int h = newOptsoutHeight;      float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了     float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了     //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可      int be = 1;//be=1表示不缩放      if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放        be = (int) (newOptsoutWidth / ww);      } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放        be = (int) (newOptsoutHeight / hh);      }      if (be <= 0) be = 1;      newOptsinSampleSize = be;//设置缩放比例      //重新读入图片,注意此时已经把optionsinJustDecodeBounds 设回false了      is = new ByteArrayInputStream(ostoByteArray());      bitmap = BitmapFactorydecodeStream(is, null, newOpts);     //压缩好比例大小后再进行质量压缩 //   return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除     return bitmap;   }         public void compressAndGenImage(Bitmap image, String outPath, int maxSize) throws IOException {     ByteArrayOutputStream os = new ByteArrayOutputStream();     // scale     int options = 100;     // Store the bitmap into output stream(no compress)     imagecompress(BitmapCompressFormatJPEG, options, os);      // Compress by loop     while ( ostoByteArray()length / 1024 > maxSize) {       // Clean up os       osreset();       // interval 10       options -= 10;       imagecompress(BitmapCompressFormatJPEG, options, os);     }          // Generate compressed image file     FileOutputStream fos = new FileOutputStream(outPath);      foswrite(ostoByteArray());      fosflush();      fosclose();    }         public void compressAndGenImage(String imgPath, String outPath, int maxSize, boolean needsDelete) throws IOException {     compressAndGenImage(getBitmap(imgPath), outPath, maxSize);          // Delete original file     if (needsDelete) {       File file = new File (imgPath);       if (fileexists()) {         filedelete();       }     }   }         public void ratioAndGenThumb(Bitmap image, String outPath, float pixelW, float pixelH) throws FileNotFoundException {     Bitmap bitmap = ratio(image, pixelW, pixelH);     storeImage( bitmap, outPath);   }         public void ratioAndGenThumb(String imgPath, String outPath, float pixelW, float pixelH, boolean needsDelete) throws FileNotFoundException {     Bitmap bitmap = ratio(imgPath, pixelW, pixelH);     storeImage( bitmap, outPath);          // Delete original file         if (needsDelete) {           File file = new File (imgPath);           if (fileexists()) {             filedelete();           }         }   }    } 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android图片压缩(质量压缩和尺寸压缩)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可
2023-05-31

Android拍照得到全尺寸图片并进行压缩

废话不多说了,直接给大家贴代码了,具体代码如下所示:2022-06-06

Linux系统下怎么批量压缩图片尺寸大小

本篇内容介绍了“Linux系统下怎么批量压缩图片尺寸大小”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Centos系统的安装使用方法: yu
2023-06-13

Android实现图片压缩(bitmap的六种压缩方式)

Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式:其中,A代表透明
2022-06-06

Android性能优化之图片大小,尺寸压缩的方法

这篇文章主要介绍“Android性能优化之图片大小,尺寸压缩的方法”,在日常操作中,相信很多人在Android性能优化之图片大小,尺寸压缩的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android性能
2023-06-30

Android如何实现压缩和解压缩文件

废话不多说了,直接给大家贴java代码了,具体代码如下所示: Java代码 package com.maidong.utils; import java.io.BufferedInputStream; import java.io.Bu
2022-06-06

Android WebP 图片压缩与传输

1. 简介 直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。 我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大
2022-06-06

Ubuntu如何批量压缩图片

小编给大家分享一下Ubuntu如何批量压缩图片,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以下就是Ubuntu压缩图片批量方法,这些Ubuntu压缩图片方法是我学了很久的心得,希望对大家有帮助。用DC拍出来的很多照片尺寸
2023-06-16

android bitmap compress(图片压缩)代码

android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小。减
2022-06-06

Android图片压缩的实例详解

Android图片压缩的实例详解在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己
2023-05-30

Android性能优化(六)图片压缩

一、压缩图片 文件压缩——内存压缩 二、文件压缩方式 1.质量压缩   2.尺寸压缩   3.格式选择:JPEG/WEBP (4.0以上) 三、压缩原理 /frameworks/base/core/jni/android/graphics/
2022-06-06

Android中文件的压缩和解压缩实例代码

使用场景 当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩.又如当我们需要从服务器中下载文件时,如果下载源文件耗时又消耗流量,较大文件需要压缩,可以使得
2022-06-06

python 批量压缩图片的脚本

目录简介需要 Needs用法 Usage代码实现效果另外一种图片压缩实现方式简介 用Python批量压缩图片,把文件夹或图片直接拖入即可 需要 Needs Python 3 Pillow (用pip install pillow来安装即可)
2022-06-02

python利用Guetzli批量压缩图片

Google 又开源了,这次开源了一款图像算法工具 Guetzli。Guetzli,在瑞士德语中是“cookie(曲奇)”的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPEG 文件来达到更快的在线体验,并且
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录