Android应用中实现图片压缩的方法有哪些
这篇文章将为大家详细讲解有关Android应用中实现图片压缩的方法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
Android图片压缩几种方式总结
图片压缩在Android开发中很常见也很重要,防止图片的OOM也是压缩的重要原因。
首先看下Bitmap图片文件的大小的决定因素:
Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数。3个参数,任意减少一个的值,就达到了压缩的效果。
接下来看下Bitmap图片的几种格式的特点:
ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节
如果进行图片格式的压缩的话,一般情况下都是ARGB_8888转为RGB565进行压缩。
写了一个工具类,基本上列举了android上图片的几种基本压缩方式:
质量压缩
采样率压缩
尺寸压缩
Matrix压缩
图片格式的压缩,例如PNG和JPG保存后的图片大小是不同的
public class Utils { public static Bitmap getBitmap(Bitmap bitmap, int sampleSize) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = sampleSize; ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bytes = baos.toByteArray(); Bitmap bit = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); Log.i("info", "图片大小:" + bit.getByteCount());//2665296 10661184 return bit; } public static Bitmap compressByQuality(Bitmap bitmap, int quality) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); byte[] bytes = baos.toByteArray(); Bitmap bit = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); Log.i("info", "图片大小:" + bit.getByteCount());//10661184 return bit; } public static Bitmap compressByQuality(Bitmap class="lazy" data-src, long maxByteSize) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int quality = 100; class="lazy" data-src.compress(Bitmap.CompressFormat.JPEG, quality, baos); while (baos.toByteArray().length > maxByteSize && quality > 0) { baos.reset(); class="lazy" data-src.compress(Bitmap.CompressFormat.JPEG, quality -= 5, baos); } if (quality < 0) return null; byte[] bytes = baos.toByteArray(); Bitmap bit = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return bit; } public static Bitmap compressByFormat(Bitmap bitmap, int format) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] bytes = baos.toByteArray(); Bitmap bit = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); Log.i("info", "图片大小:" + bit.getByteCount());//10661184 return bit; } public static Bitmap getBitmapBySize(Bitmap bitmap, float scaleWidth, float scaleHeight) { Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap bit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); Log.i("info", "图片大小:" + bit.getByteCount()); return bit; } public static Bitmap getBitmapByFormatConfig(String path, Bitmap.Config config) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = config; Bitmap bitmap = BitmapFactory.decodeFile(path, options); Log.i("info", "图片大小:" + bitmap.getByteCount()); return bitmap; } public static Bitmap getBitmapByScaleSize(Bitmap bitmap, int width, int height) { Bitmap bit = Bitmap.createScaledBitmap(bitmap, width, height, true); Log.i("info", "图片大小:" + bit.getByteCount()); return bit; } public static Bitmap getBitmapByFormat(Bitmap bitmap, Bitmap.CompressFormat format) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(format, 100, baos); byte[] bytes = baos.toByteArray(); Bitmap bit = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); Log.i("info", "图片大小:" + bit.getByteCount()); return bit; } public static Bitmap getBitmap(String filePath, int inSampleSize) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options);//此时不耗费和占用内存 options.inSampleSize = inSampleSize; options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filePath, options); } public static Bitmap getBitmap(String filePath) { return BitmapFactory.decodeFile(filePath); } public static Bitmap view2Bitmap(View view) { if (view == null) return null; Bitmap ret = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(ret); Drawable bgDrawable = view.getBackground(); if (bgDrawable != null) { bgDrawable.draw(canvas); } else { canvas.drawColor(Color.WHITE); } view.draw(canvas); return ret; } public static void saveBitmap(Bitmap bitmap) { File file = new File(Environment.getExternalStorageDirectory() + "/img.jpg"); try { FileOutputStream fileOutputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void saveBitmap(Bitmap bitmap,Bitmap.CompressFormat format) { File file = new File(Environment.getExternalStorageDirectory() + "/img.jpg"); try { FileOutputStream fileOutputStream = new FileOutputStream(file); bitmap.compress(format, 100, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Android应用中实现图片压缩的方法有哪些
下载Word文档到电脑,方便收藏和打印~
猜你喜欢
Android应用中实现图片压缩的方法有哪些
Android常见的图片压缩方式有哪些
Android实现简单图片压缩的方法
Android实现图片压缩(bitmap的六种压缩方式)
android图片压缩的3种方法实例
Linux中有哪些压缩格式的压缩与解压方法
怎么使用Canvas drawImage方法实现图片压缩
Linux系统有哪些常用的压缩解压方法
Android中WebView图片实现自适应的方法
Android实现旋转,放大,缩小图片的方法
Java图片批量压缩像素的实现方法是什么
Android应用中实现文件下载的方法有哪些
如何使用PHP进行文件的压缩和解压缩?(PHP中实现文件压缩和解压缩的常用库有哪些?)
Android应用中实现动画的方式有哪些
android应用中实现异步更新UI的方法有哪些
编程热搜
Python 学习之路 - Python
一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-chatgpt的中文全称是什么
chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列C/C++可变参数的使用
可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃Python 3 教程
Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 PythonPython pip包管理
一、前言 在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install 和 pip , 目前官方推荐使用 pip。
编程资源站
- 资料下载
- 历年试题