广告
返回顶部
首页 > 资讯 > 精选 >Android图片压缩(质量压缩和尺寸压缩)
  • 753
分享到

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

android图片压缩roi 2023-05-31 14:05:05 753人浏览 泡泡鱼
摘要

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

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

--结束END--

本文标题: Android图片压缩(质量压缩和尺寸压缩)

本文链接: https://www.lsjlt.com/news/226203.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Android图片压缩(质量压缩和尺寸压缩)
    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可...
    99+
    2023-05-31
    android 图片压缩 roi
  • java实现上传图片尺寸修改和质量压缩
    本文实例为大家分享了java实现上传图片尺寸修改和质量压缩的具体代码,供大家参考,具体内容如下 package com.zity.frame.util;     import co...
    99+
    2022-11-13
  • Android拍照得到全尺寸图片并进行压缩
    废话不多说了,直接给大家贴代码了,具体代码如下所示: <LinearLayout xmlns:android="http://schemas.android.com/a...
    99+
    2022-06-06
    压缩 图片 android拍照 Android
  • Android实现图片压缩(bitmap的六种压缩方式)
    Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x...
    99+
    2022-06-06
    压缩 图片 bitmap 图片压缩 Android
  • php 图片压缩
    public function compressedImage($imgsrc, $imgdst) { list($width, $height, $type) = getimagesize($imgsr...
    99+
    2023-08-30
    前端 javascript html
  • java图片压缩
    1背景 查看各种文章,发现thumbnailator的压缩率和压缩效果都不错,thumbnailator又是使用java实现的,所以直接扒源码,找到了里面实现压缩的关键代码,封装成一个压缩工具类,有需...
    99+
    2023-08-31
    java 图像处理
  • Linux系统下怎么批量压缩图片尺寸大小
    本篇内容介绍了“Linux系统下怎么批量压缩图片尺寸大小”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Centos系统的安装使用方法: yu...
    99+
    2023-06-13
  • java 实现图片像素质量压缩与图片长宽缩放
    目录java 图片像素质量压缩与图片长宽缩放java 修改图片dpi(像素/大小)java 图片像素质量压缩与图片长宽缩放 今天找到的这个方法比以前项目用到的方法更好,这里记录下,方...
    99+
    2022-11-12
  • Android性能优化之图片大小,尺寸压缩的方法
    这篇文章主要介绍“Android性能优化之图片大小,尺寸压缩的方法”,在日常操作中,相信很多人在Android性能优化之图片大小,尺寸压缩的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android性能...
    99+
    2023-06-30
  • Android如何实现压缩和解压缩文件
    废话不多说了,直接给大家贴java代码了,具体代码如下所示: Java代码 package com.maidong.utils; import java.io.Buffe...
    99+
    2022-06-06
    压缩 解压 Android
  • android bitmap compress(图片压缩)代码
    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络...
    99+
    2022-06-06
    压缩 compress 图片 bitmap 图片压缩 Android
  • Android WebP 图片压缩与传输
    1. 简介 直到4g时代,流量依然是宝贵的东西。而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题。 我们关注的问题,无非是图片体积和质量如何...
    99+
    2022-06-06
    图片 压缩 webp 图片压缩 Android
  • Ubuntu如何批量压缩图片
    小编给大家分享一下Ubuntu如何批量压缩图片,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以下就是Ubuntu压缩图片批量方法,这些Ubuntu压缩图片方法是我学了很久的心得,希望对大家有帮助。用DC拍出来的很多照片尺寸...
    99+
    2023-06-16
  • python实现图片批量压缩
    目录第一种 一:安装包二:导入包三:获取图片文件的大小四:输出文件夹下的文件五:压缩文件到指定大小,我期望的是150KB,step和quality可以修改到最合适的数值六:...
    99+
    2022-11-12
  • Android性能优化(六)图片压缩
    一、压缩图片 文件压缩——内存压缩 二、文件压缩方式 1.质量压缩   2.尺寸压缩   3.格式选择:JPEG/WEBP (4.0以上) 三、压缩原理 /frameworks...
    99+
    2022-06-06
    压缩 图片 优化 图片压缩 Android
  • Android图片压缩的实例详解
    Android图片压缩的实例详解在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己...
    99+
    2023-05-30
    android 图片压缩 roi
  • python 批量压缩图片的脚本
    目录简介需要 Needs用法 Usage代码实现效果另外一种图片压缩实现方式简介 用Python批量压缩图片,把文件夹或图片直接拖入即可 需要 Needs Python 3 Pillow (用pip install ...
    99+
    2022-06-02
    python 图片压缩 python 批量压缩
  • python利用Guetzli批量压缩图片
    Google 又开源了,这次开源了一款图像算法工具 Guetzli。Guetzli,在瑞士德语中是“cookie(曲奇)”的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPE...
    99+
    2022-06-04
    批量 图片 python
  • Android中文件的压缩和解压缩实例代码
    使用场景 当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩.又如当我们需要从服务器中下载...
    99+
    2022-06-06
    压缩 解压 Android
  • Android性能优化之图片大小,尺寸压缩综合解决方案
    目录前言常见的图片压缩方法质量压缩尺寸压缩libjpeg图片压缩流程总结前言 在Android中我们经常会遇到图片压缩的场景,比如给服务端上传图片,包括个人信息的用户头像,有时候人脸...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作