返回顶部
首页 > 资讯 > 精选 >Android开发怎么实现图片大小与质量压缩及保存
  • 926
分享到

Android开发怎么实现图片大小与质量压缩及保存

2023-06-30 11:06:47 926人浏览 安东尼
摘要

本篇内容主要讲解“Android开发怎么实现图片大小与质量压缩及保存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android开发怎么实现图片大小与质量压缩及保存”吧!Android中图片有四

本篇内容主要讲解“Android开发怎么实现图片大小与质量压缩及保存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android开发怎么实现图片大小与质量压缩及保存”吧!

    Android中图片有四种属性

    ALPHA_8:每个像素占用1byte内存

    ARGB_4444:每个像素占用2byte内存

    ARGB_8888:每个像素占用4byte内存 (默认)

    RGB_565:每个像素占用2byte内存

    Android默认的颜色模式为ARGB_8888,这个颜色模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。所以在对图片效果不是特别高的情况下使用RGB_565(565没有透明度属性)

    Android目前常用图片格式

    有png,jpeg和WEBp

    png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用该格式

    jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的(大图压缩,不适合loGo)

    webp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从谷歌官网来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有损webp在Android4.0(api 14)之后支持,无损和透明在Android4.3(API18)之后支持

    使用

    大小压缩

    private Bitmap getimage(String srcPath) {          BitmapFactory.Options newOpts = new BitmapFactory.Options();          //开始读入图片,此时把options.inJustDecodeBounds 设回true了          newOpts.inJustDecodeBounds = true;          Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空          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);//压缩好比例大小后再进行质量压缩      }

    质量压缩

    注意:

    第二次压缩之前都要先清空 baos.reset(); 再进行压缩

    image.compress(Bitmap.CompressFORMat.JPEG, quality, baos);

    有时候我们采用质量压缩没有效果,有可能是每次压缩的质量过小,所以我们可以尝试修改压缩质量(quality)是10;

    quality压缩机提示,0-100。0表示压缩小尺寸,100意味着最大质量的压缩。一些格式,如无损的PNG,将忽略质量设定;

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

    混合方式压缩

    private Bitmap comp(Bitmap image) {      ByteArrayOutputStream baos = new ByteArrayOutputStream();             image.compress(Bitmap.CompressFormat.JPEG, 100, baos);      if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出            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);      } 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);//压缩好比例大小后再进行质量压缩  }

    采样率压缩

    采样率压缩是通过设置BitmapFactory.Options.inSampleSize,来减小图片的分辨率,进而减小图片所占用的磁盘空间和内存大小。

    设置的inSampleSize会导致压缩的图片的宽高都为1/inSampleSize,整体大小变为原始图片的inSampleSize平方分之一,当然,这些有些注意点:

    • inSampleSize小于等于1会按照1处理

    • inSampleSize只能设置为2的平方,不是2的平方则最终会减小到最近的2的平方数,如设置7会按4进行压缩,设置15会按8进行压缩。

    public static void compress(int inSampleSize) {    File sdFile = Environment.getExternalStorageDirectory();    File originFile = new File(sdFile, "originImg.jpg");    BitmapFactory.Options options = new BitmapFactory.Options();    //设置此参数是仅仅读取图片的宽高到options中,不会将整张图片读到内存中,防止oom    options.inJustDecodeBounds = true;    Bitmap emptyBitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath(), options);    options.inJustDecodeBounds = false;    options.inSampleSize = inSampleSize;    Bitmap resultBitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath(), options);    ByteArrayOutputStream bos = new ByteArrayOutputStream();    resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);    try {        FileOutputStream fos = new FileOutputStream(new File(sdFile, "resultImg.jpg"));        fos.write(bos.toByteArray());        fos.flush();        fos.close();    } catch (FileNotFoundException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }}

    图片保存到本地

         public static String saveBitmap(Context context, Bitmap mBitmap) {        String savePath;        File filePic;        try {            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {                savePath = SD_PATH;            } else {                savePath = context.getApplicationContext().getFilesDir().getAbsolutePath() + IN_PATH;            }            filePic = new File(savePath + DateTimeHelper.format(new Date(), "yyyyMMddHHmmss") + ".jpg");            Log.d("LUO", "图片地址====" + filePic);            if (!filePic.exists()) {                filePic.getParentFile().mkdirs();                filePic.createNewFile();            }            FileOutputStream fos = new FileOutputStream(filePic);            //不压缩,保存本地            mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);            fos.flush();            fos.close();        } catch (IOException e) {            e.printStackTrace();            return null;        }        return filePic.getAbsolutePath();    }

    到此,相信大家对“Android开发怎么实现图片大小与质量压缩及保存”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: Android开发怎么实现图片大小与质量压缩及保存

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

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

    猜你喜欢
    • Android开发实现图片大小与质量压缩及保存
      目录Android中图片有四种属性Android目前常用图片格式使用大小压缩质量压缩混合方式压缩采样率压缩图片保存到本地Android中图片有四种属性 ALPHA_8:每个像素占用1...
      99+
      2024-04-02
    • Android开发怎么实现图片大小与质量压缩及保存
      本篇内容主要讲解“Android开发怎么实现图片大小与质量压缩及保存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android开发怎么实现图片大小与质量压缩及保存”吧!Android中图片有四...
      99+
      2023-06-30
    • java 实现图片像素质量压缩与图片长宽缩放
      目录java 图片像素质量压缩与图片长宽缩放java 修改图片dpi(像素/大小)java 图片像素质量压缩与图片长宽缩放 今天找到的这个方法比以前项目用到的方法更好,这里记录下,方...
      99+
      2024-04-02
    • springboot怎么实现图片大小压缩功能
      本篇内容主要讲解“springboot怎么实现图片大小压缩功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot怎么实现图片大小压缩功能”吧!application.proper...
      99+
      2023-06-30
    • Android实现ImageView图片双击放大及缩小
      本文实例介绍了Android实现ImageView图片双击放大及缩小的相关技巧,分享给大家供大家参考,具体内容如下 public class DoubleScaleImage...
      99+
      2022-06-06
      Android
    • android开发中项目实现一个图片压缩功能并能指定大小
      android开发中项目实现一个图片压缩功能并能指定大小?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 ...
      99+
      2023-05-31
      android roi
    • python怎么实现图片批量压缩
      这篇文章主要介绍python怎么实现图片批量压缩,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮...
      99+
      2023-06-14
    • 使用php怎么压缩图片并保持大小不变
      这篇文章将为大家详细讲解有关使用php怎么压缩图片并保持大小不变,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。cdn静态资源包oss管理文件资源,不一定是图片,也可以是文件哦搭建自己的文件服...
      99+
      2023-06-14
    • Android中怎么实现图片压缩与上传功能
      Android中怎么实现图片压缩与上传功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先需要对图片进行压缩,这方面可以使用第三方的库,我在实际的开发中使用的...
      99+
      2023-05-30
      android
    • Android中怎么实现图片压缩功能
      Android中怎么实现图片压缩功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、图片质量压缩    public s...
      99+
      2023-05-31
      android
    • Linux系统下怎么批量压缩图片尺寸大小
      本篇内容介绍了“Linux系统下怎么批量压缩图片尺寸大小”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Centos系统的安装使用方法: yu...
      99+
      2023-06-13
    • Android怎么实现图片预览与保存功能
      这篇“Android怎么实现图片预览与保存功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android怎么实现图片预览与...
      99+
      2023-06-30
    • Android 实现WebView点击图片查看大图列表及图片保存功能
       在日常开发过程中,有时候会遇到需要在app中嵌入网页,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片。本文将就这一系列问题的...
      99+
      2022-06-06
      列表 图片 webview Android
    • Android中怎么实现图片压缩并加载显示
      这篇文章将为大家详细讲解有关Android中怎么实现图片压缩并加载显示,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。解析:图片压缩的关键就是options.inSampleSize ...
      99+
      2023-05-30
      android
    • JS怎么实现图片放大缩小的方法
      这篇文章主要介绍了JS怎么实现图片放大缩小的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例讲述了JS实现图片放大缩小的方法。分享...
      99+
      2024-04-02
    • 怎么在Java中实现一个图片高质量缩放类
      怎么在Java中实现一个图片高质量缩放类?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。package com.test;import com...
      99+
      2023-05-30
      java
    • android保存图片到相册功能怎么实现
      要实现在Android应用中保存图片到相册的功能,可以按照以下步骤进行操作: 首先,确保应用已经获取了写入外部存储的权限。在And...
      99+
      2024-04-02
    • css怎么实现改变图片大小按比例缩放
      本篇内容介绍了“css怎么实现改变图片大小按比例缩放”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,在页面中创建一个img标签,并插入图...
      99+
      2023-07-04
    • Android开发实现图片平移、缩放、倒影及旋转功能的方法
      本文实例讲述了Android开发实现图片平移、缩放、倒影及旋转功能的方法。分享给大家供大家参考,具体如下:解析:1)根据原来的图片创建新的图片Bitmap modBm = Bitmap.createBitmap(bm.getWidth()+...
      99+
      2023-05-30
      android 图片 roi
    • Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能
      这篇文章主要讲解了“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”吧!效果:实现思路在j...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作