美文网首页
Android中图片的压缩方法

Android中图片的压缩方法

作者: dashingqi | 来源:发表于2019-09-29 11:00 被阅读0次

Bitmap

  1. Android中图片是以Bitmap(位图)形式存在,位图常见的文件格式有:.bmp .jpg .png .gif 。
  2. Bitmap的大小计算 = 图片的长度图片的宽度单位像素所占用的字节数。
  3. Bitmap的优缺点
  • 优点:色彩变化丰富,可以改变任何形状的区域色彩显示效果。
  • 缺点:放大和缩小都会引起像素的增加和缩小,这样会使图片出现失真或者锯齿形。另一个缺点就是像素越高数据量越大占用的内存越大。

常用压缩方法

质量压缩
  1. 质量压缩是不会改变图片的宽高(像素),是去改变图片的位深和透明度的。
  2. png是无损压缩的,所以质量压缩对png是不起作用的
/**
     * 质量压缩
     * 降低图片的质量,不会减少图片的像素,改变图片的位深和透明度,没有改变像素大小,所以不会减少占据的内存大小。
     */
    private void qualityCompress(Bitmap.CompressFormat format, int quality, String type) {
        try {
            File file = new File(Environment.getExternalStorageDirectory(), "test_" + quality + format + "_" + type + ".jpg");
            //得到一个文件输入流
            mFileOutputStream = new FileOutputStream(file);

            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_pic);
            // 图片的格式  quality是压缩完之后保存图片设置的质量参数  png是无损压缩,quality参数对png无效
            bitmap.compress(format, quality, mFileOutputStream);

        } catch (FileNotFoundException exception) {
            exception.printStackTrace();
        } finally {
            if (mFileOutputStream != null) {
                try {
                    mFileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
采样率压缩
  1. 降低图片的像素。数值越高,图片像素越低。
/**
     * 尺寸压缩中的采样率压缩
     * 改变了像素,减少了图片占用的内存,同样照片的清晰度也降低了。
     * inSampleSize = 2 内存将减少 1/4  内存大小 = 图片宽/inSampleSize * 图片高/inSampleSize * 单位像素占用的字节大小
     */
    private void loadImage() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        //设置为true 并会将图片加载到内存中,但是可以获取到图片的宽和高 通过options
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.ic_pic, options);
        int outWidth = options.outWidth;
        int outHeight = options.outHeight;
        Log.d(TAG, "loadImage: width = " + outWidth);
        Log.d(TAG, "loadImage: height = " + outHeight);
        //这个地方根据获取到大小和想要显示的大小做缩放
        options.inSampleSize = calculateInSampleSize(options, 200, 200);
        Log.d(TAG, "loadImage: inSampleSize = " + options.inSampleSize);
        //设置为false 这回再去解码图片可以将其读取到内存中了。
        options.inJustDecodeBounds = false;
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_pic, options);
        File file = new File(Environment.getExternalStorageDirectory(), "text_" + "just_100_no_inSampleSize.jpg");
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


//        mImageView.setImageBitmap(mBitmap);

    }

    /**
     * 计算图片的缩放比例
     *
     * @param options
     * @param reqHeight
     * @param reqWidth
     */
    private int calculateInSampleSize(BitmapFactory.Options options, int reqHeight, int reqWidth) {
        int height = options.outHeight;
        int width = options.outWidth;
        //缩放的比例
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            int halfHeight = height / 2;
            int halfWidth = width / 2;
            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;

    }
缩放法压缩
  1. 减小图片的像素,生成的图片file的大小也变小了。
/**
     * 尺寸压缩中的 按缩放比压缩 这里的缩放比是事先定义好的 和采样率相比 采样率是根据给定的预期大小去计算缩放比
     *
     * @param mBitmap
     * @param mFile
     */
    private void compressBitmapToFile(Bitmap mBitmap, File mFile) {
        //设置压缩倍数
        int ratio = 2;

        //压缩Bitmap到对应的尺寸 压缩格式 ARGB_8888 4字节 一个像素需要4个字节来存储
        Bitmap resultBitmap = Bitmap.createBitmap(mBitmap.getWidth() / ratio, mBitmap.getHeight() / ratio, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(resultBitmap);
        Rect rect = new Rect(0, 0, mBitmap.getWidth() / ratio, mBitmap.getHeight() / ratio);
        canvas.drawBitmap(mBitmap, null, rect, null);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        File file = new File(Environment.getExternalStorageDirectory(), "test_compress_100.jpg");
        resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        try {
            mFileOutputStream1 = new FileOutputStream(file);
            mFileOutputStream1.write(byteArrayOutputStream.toByteArray());
            mFileOutputStream1.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (mFileOutputStream1 != null) {
                try {
                    mFileOutputStream1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

相关文章

  • 图片压缩之优化篇

    之前曾经对Android中图片中的压缩方式进行分析和总结。详见图片压缩篇。基本涵盖了基础的压缩方法和思路。但是在实...

  • Android中图片的压缩方法

    Bitmap Android中图片是以Bitmap(位图)形式存在,位图常见的文件格式有:.bmp .jpg .p...

  • 图片压缩

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法、比例压缩法(根据路径获取图片并压缩)和比例压缩...

  • Android:图片压缩的几种方式

    1、前言 在Android中,图片的压缩对于内存的优化很重要 通过这篇文章对Android中的几种图片压缩方式进行...

  • Android应用开发中三种常见的图片压缩方法

    Android应用开发中三种常见的图片压缩方法

  • iOS 图片压缩方法

    iOS 图片压缩方法 更多图片处理方法见图片组件 BBWebImage iOS 图片压缩方法 两种图片压缩方法 两...

  • iOS 图片压缩方法

    两种图片压缩方法 两种图片压缩方法:压缩图片质量(Quality),压缩图片尺寸(Size)。 压缩图片质量 通过...

  • iOS 图片压缩限制大小

    一、两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size)。 压缩图片质量...

  • iOS 图片压缩方法

    两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size)。 压缩图片质量 N...

  • elementUi el-upload组件图片上传之前压缩图片大

    将图片导入到canvas画布中,利用画布重绘压缩图片,降低图片质量 压缩方法调用

网友评论

      本文标题:Android中图片的压缩方法

      本文链接:https://www.haomeiwen.com/subject/qyklsctx.html