Android关于Bitmap的缩放方法

635 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情 >> 希望大家可以帮忙点个赞,谢谢!

前言

最近要将图片传给服务器,但是服务器限制了图片的大小,所以我查询了许多相关文章,现在将其罗列出来。

正篇

首先,我们看看根据坐标系的做法:


    // 获得图片的宽高
    int width = bm.getWidth();
    int height = bm.getHeight();
    // 设置想要的大小
    int newWidth = 640;
    int newHeight = 480;
    // 计算缩放比
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // 取得想要缩放的matrix参数
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    // 得到新的图片
    Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height,matrix,true);

还有非常重要的质量压缩方法:

     Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.test);
     ByteArrayOutputStream bos = new ByteArrayOutputStream();
     int option = 100;
     bm.compress(Bitmap.CompressFormat.JPEG, option, bos);
     byte[] bytes = bos.toByteArray();
     srcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

其中option在0-100之间,越小代表压缩率越高,质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片的长,宽,像素都不会改变,所以bitmap所占内存大小是不会变的,一般头像可以用这个方法,不过质量压缩对png格式这种图片格式没有作用,因为png是无损压缩的。

接着我们看一下采样率压缩:

BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);

采样率压缩是通过缩放bitamp的尺寸,改变inSampleSize参数,比如当inSampleSize为5时,宽高会为原来的1/5,所以内存也会变成原来的1/25. 此外,还有RGB_565压缩:

BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);

通过压缩像素占用的内存来达到压缩的效果,没有用过,暂时不知道是什么效果,当然还可以指定大小压缩:

 Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        srcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
        bm = null;

同样没用过,不过最后应该将原来的bitmap释放掉,不然容易占空间,应该就是指定宽高的感觉。

总结

虽然最近需要用这方面知识,但还是掌握的不牢靠,还需要多加练习测试代码效果,不然很快就会忘却的。