iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android的bitmap图片优化方法是什么
  • 613
分享到

Android的bitmap图片优化方法是什么

2023-06-25 13:06:32 613人浏览 八月长安
摘要

这篇文章主要讲解了“Android的bitmap图片优化方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android的bitmap图片优化方法是什么”吧!背景Android开发中,

这篇文章主要讲解了“Android的bitmap图片优化方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android的bitmap图片优化方法是什么”吧!

背景

Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应用施加内存限制,默认分配的内存只有几M(具体视不同系统而定)。而载入的图片如果是JPG之类的压缩格式(JPG支持最高级别的压缩,不过该压缩是有损的),在内存中展开会占用大量的内存空间,也就容易形成内存溢出。那么高效的加载Bitmap是很重要的事情。Bitmap在Android中指的是一张图片,图片的格式有.jpg .jpg .WEBp 等常见的格式。

如何选择图片格式

一个原则: 在保证图片视觉不失真前提下,尽可能的缩小体积

Android目前常用的图片格式有jpg,jpeg和webp

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

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

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

采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小

图片压缩

图片压缩可以从三个方面去考虑:

1.质量

质量压缩并不会改变图片在内存中的大小,仅仅会减小图片所占用的磁盘空间的大小,因为质量压缩不会改变图片的分辨率,而图片在内存中的大小是根据widthheight一个像素的所占用的字节数计算的,宽高没变,在内存中占用的大小自然不会变,质量压缩的原理是通过改变图片的位深和透明度来减小图片占用的磁盘空间大小,所以不适合作为缩略图,可以用于想保持图片质量的同时减小图片所占用的磁盘空间大小。另外,由于jpg是无损压缩,所以设置quality无效,

  public static void compress(Bitmap.CompressFORMat format, int quality) {    File sdFile = Environment.getExternalStorageDirectory();    File originFile = new File(sdFile, "originImg.jpg");    Bitmap originBitmap = BitmapFactory.decodeFile(originFile.getAbsolutePath());    ByteArrayOutputStream bos = new ByteArrayOutputStream();    originBitmap.compress(format, quality, 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();    }}

2.采样率

采样率压缩是通过设置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();    }}

3.缩放

通过减少图片的像素来降低图片的磁盘空间大小和内存大小,可以用于缓存缩略图

     public static Bitmap resizeBitmap(Context context,int id,int maxW,int maxH,boolean hasAlpha,Bitmap reusable){        Resources resources = context.getResources();        BitmapFactory.Options options = new BitmapFactory.Options();        // 只解码出 outxxx参数 比如 宽、高        options.inJustDecodeBounds = true;        BitmapFactory.decodeResource(resources,id,options);        //根据宽、高进行缩放        int w = options.outWidth;        int h = options.outHeight;        //设置缩放系数        options.inSampleSize = calcuteInSampleSize(w,h,maxW,maxH);        if (!hasAlpha){            options.inPreferredConfig = Bitmap.Config.RGB_565;        }        options.inJustDecodeBounds = false;        //设置成能复用        options.inMutable=true;        options.inBitmap=reusable;        return BitmapFactory.decodeResource(resources,id,options);    }        private static int calcuteInSampleSize(int w,int h,int maxW,int maxH) {        int inSampleSize = 1;        if (w > maxW && h > maxH){            inSampleSize = 2;            //循环 使宽、高小于 最大的宽、高            while (w /inSampleSize > maxW && h / inSampleSize > maxH){                inSampleSize *= 2;            }        }        return inSampleSize;    }}
  • 使用JPEG库,在jni层使用哈夫曼算法去压缩图片

Android的图片引擎使用的是阉割版的skia引擎,去掉了图片压缩中的哈夫曼算法

void write_JPEG_file(uint8_t *data, int w, int h, jint q, const char *path) {//    3.1、创建jpeg压缩对象    jpeg_compress_struct jcs;    //错误回调    jpeg_error_mgr error;    jcs.err = jpeg_std_error(&error);    //创建压缩对象    jpeg_create_compress(&jcs);//    3.2、指定存储文件  write binary    FILE *f = fopen(path, "wb");    jpeg_stdio_dest(&jcs, f);//    3.3、设置压缩参数    jcs.image_width = w;    jcs.image_height = h;    //bgr    jcs.input_components = 3;    jcs.in_color_space = JCS_RGB;    jpeg_set_defaults(&jcs);    //开启哈夫曼功能    jcs.optimize_coding = true;    jpeg_set_quality(&jcs, q, 1);//    3.4、开始压缩    jpeg_start_compress(&jcs, 1);//    3.5、循环写入每一行数据    int row_stride = w * 3;//一行的字节数    jsAMPROW row[1];    while (jcs.next_scanline < jcs.image_height) {        //取一行数据        uint8_t *pixels = data + jcs.next_scanline * row_stride;        row[0]=pixels;        jpeg_write_scanlines(&jcs,row,1);    }//    3.6、压缩完成    jpeg_finish_compress(&jcs);//    3.7、释放jpeg对象    fclose(f);    jpeg_destroy_compress(&jcs);}

因为涉及到jni部分,暂时只贴一下使用的代码,后面会写一些jni部分的博客与大家分享。

  • 设置图片可以复用

图片复用主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。

需要注意的是inBitmap只能在3.0以后使用。2.3上,bitmap的数据是存储在native的内存区域,并不是在Dalvik的内存堆上。

使用inBitmap,在4.4之前,只能重用相同大小的bitmap的内存区域,而4.4之后你可以重用任何bitmap的内存区域,只要这块内存比将要分配内存的bitmap大就可以。这里最好的方法就是使用LRUCache来缓存bitmap,后面来了新的bitmap,可以从cache中按照api版本找到最适合重用的bitmap,来重用它的内存区域。

   BitmapFactory.Options options = new BitmapFactory.Options();        // 只解码出 outxxx参数 比如 宽、高        options.inJustDecodeBounds = true;        BitmapFactory.decodeResource(resources,id,options);        //根据宽、高进行缩放        int w = options.outWidth;        int h = options.outHeight;        //设置缩放系数        options.inSampleSize = calcuteInSampleSize(w,h,maxW,maxH);        if (!hasAlpha){            options.inPreferredConfig = Bitmap.Config.RGB_565;        }        options.inJustDecodeBounds = false;        //设置成能复用        options.inMutable=true;        options.inBitmap=reusable;
  • 使用图片缓存

android中有一个LruCache是基于最记最少使用算法实现的一个线程安全的数据缓存类,当超出设定的缓存容量时,优先淘汰最近最少使用的数据LruCache的LRU缓存策略是利用LinkedHashMap来实现的,并通过封装get/put等相关方法来实现控制缓存大小以及淘汰元素,但不支持为null的key和value。 我们可以使用JakeWharton提供的一个开源GitHub.com/JakeWharton… 来实现我们图片缓存的逻辑

Android的bitmap图片优化方法是什么

省略了内存和磁盘的部分。

Android的bitmap图片优化方法是什么

感谢各位的阅读,以上就是“Android的bitmap图片优化方法是什么”的内容了,经过本文的学习后,相信大家对Android的bitmap图片优化方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Android的bitmap图片优化方法是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Android的bitmap图片优化方法是什么
    这篇文章主要讲解了“Android的bitmap图片优化方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android的bitmap图片优化方法是什么”吧!背景Android开发中,...
    99+
    2023-06-25
  • Android 性能优化系列之bitmap图片优化
    背景 Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应用施加内存限制,默认分配的内存只有几M(...
    99+
    2024-04-02
  • 怎么在Android应用中利用Bitmap对图片进行优化
    这篇文章给大家介绍怎么在Android应用中利用Bitmap对图片进行优化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎...
    99+
    2023-05-31
    android roi bitmap
  • Android中本地图片和bitmap的相互转化
    将Bitmap转换为图片 public static void saveImage(String path, Bitmap bitmap){   try {       BufferedOutputStream bos = new Bu...
    99+
    2023-09-12
    android java 开发语言
  • Android Fresco图片加载优化的方案
    目录优化背景数据记录优化方案注意事项优化背景 一般情况下,Fresco图片加载需使用SimpleDraweeView,这个控件并不能自动根据自身的尺寸按需加载图片,即一个 N×N ...
    99+
    2024-04-02
  • Android 基于Bitmap的四种图片压缩方式
    目录知识点介绍 正文 1、质量压缩 2、采样率压缩 3、缩放法压缩 4、RGB_565 通过改变图片格式来实现压缩 总结 知识点介绍 Android 中图片主要以 Bitmap 的...
    99+
    2024-04-02
  • Android Fresco图片加载怎么优化
    小编给大家分享一下Android Fresco图片加载怎么优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!优化背景一般情况下,Fresco图片加载需使用Simp...
    99+
    2023-06-14
  • JAVA灰度化和二值化图片的方法是什么
    这篇文章主要讲解了“JAVA灰度化和二值化图片的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JAVA灰度化和二值化图片的方法是什么”吧!package image;&n...
    99+
    2023-06-17
  • Android Canvas和Bitmap的结合绘图流程是什么
    这篇文章主要介绍“Android Canvas和Bitmap的结合绘图流程是什么”,在日常操作中,相信很多人在Android Canvas和Bitmap的结合绘图流程是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-25
  • Android冷启动耗时优化的方法是什么
    这篇文章主要介绍了Android冷启动耗时优化的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android冷启动耗时优化的方法是什么文章都会有所收获,下面我们一起来看看吧。1,背景最近开发了一个新的...
    99+
    2023-06-26
  • Android性能优化之图片大小,尺寸压缩的方法
    这篇文章主要介绍“Android性能优化之图片大小,尺寸压缩的方法”,在日常操作中,相信很多人在Android性能优化之图片大小,尺寸压缩的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android性能...
    99+
    2023-06-30
  • Web图片优化的方法有哪些
    这篇文章主要讲解了“Web图片优化的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Web图片优化的方法有哪些”吧!图像是web上提供的最基本的内容...
    99+
    2024-04-02
  • vps图片优化的方法有哪些
    对于VPS图片优化,可以采用以下方法:1. 图片压缩:使用图片压缩工具,如JPEGmini、TinyPNG等,可以将图片压缩到较小的...
    99+
    2023-09-08
    vps
  • sparksql优化的方法是什么
    SparkSQL优化的方法有以下几种: 数据分区:根据数据的特点和查询的需求,将数据划分成多个分区。这样可以提高查询的性能,因为...
    99+
    2023-10-22
    sparksql
  • java中bitmap的使用方法是什么
    在Java中使用Bitmap需要先导入相关的类库,通常是android.graphics.Bitmap类。Bitmap类提供了一系列...
    99+
    2024-04-02
  • MySQL优化的方法是什么
    这篇文章主要介绍“MySQL优化的方法是什么”,在日常操作中,相信很多人在MySQL优化的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL优化的方法是什么”...
    99+
    2024-04-02
  • android studio汉化的方法是什么
    要将Android Studio汉化,可以按照以下步骤操作:1. 在Android Studio的官方网站上下载汉化包,也可以通过搜...
    99+
    2023-10-18
    android
  • Android图片加载库Glide用法是什么
    这篇文章主要讲解了“Android图片加载库Glide用法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android图片加载库Glide用法是什么”吧!Glide介绍Glide是一个...
    99+
    2023-06-22
  • python读取图片的方法是什么
    Python中读取图片的方法有多种,可以使用第三方库如PIL(Python Imaging Library)或OpenCV,也可以使...
    99+
    2024-02-29
    python
  • web图片替换的方法是什么
    这篇文章主要介绍“web图片替换的方法是什么”,在日常操作中,相信很多人在web图片替换的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”web图片替换的方法是什么”...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作