这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
这篇文章主要介绍了 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 上图片的几种基本压缩方式:
1. 质量压缩
2. 采样率压缩
3. 尺寸压缩
4.Matrix 压缩
5. 图片格式的压缩,例如 PNG 和 JPG 保存后的图片大小是不同的
- public class Utils {
- /**
- * 采样率压缩
- *
- * @param bitmap
- * @param sampleSize 采样率为2的整数倍,非整数倍四舍五入,如4的话,就是原图的1/4
- * @return 尺寸变化
- */
- 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;
- }
- /**
- * 图片质量压缩
- *
- * @param bitmap
- * @param quality
- * @return 尺寸不变,质量变小
- */
- 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;
- }
- /**
- * 图片质量压缩
- *
- * @param src
- * @param maxByteSize
- * @return
- */
- public static Bitmap compressByQuality(Bitmap src, long maxByteSize) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- int quality = 100;
- src.compress(Bitmap.CompressFormat.JPEG, quality, baos);
- while (baos.toByteArray().length > maxByteSize && quality > 0) {
- baos.reset();
- 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;
- }
- /**
- * Matrix缩放
- *
- * @param bitmap
- * @param scaleWidth
- * @param scaleHeight
- * @return 尺寸和大小变化
- */
- 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;
- }
- /**
- * 按照图片格式配置压缩
- *
- * @param path
- * @param config ALPHA_8,ARGB_4444,ARGB_8888,RGB_565;
- * @return RGB_565比ARGB_8888节省一半内存
- */
- 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;
- }
- /**
- * 指定大小缩放
- *
- * @param bitmap
- * @param width
- * @param height
- * @return
- */
- 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;
- }
- /**
- * 通过保存格式压缩
- *
- * @param bitmap
- * @param format JPEG,PNG,webP
- * @return
- */
- 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;
- }
- /**
- * 文件加载压缩
- *
- * @param filePath
- * @param inSampleSize
- * @return
- */
- 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();
- }
- }
- }
来源: http://www.phperz.com/article/17/0709/336619.html