Android关于Bitmap的缩放方法

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

正篇

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

// 获得图片的宽高
    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释放掉,不然容易占空间,应该就是指定宽高的感觉。

总结

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

相关文章
|
1月前
|
Android开发
Android调用相机与相册的方法1
Android调用相机与相册的方法
37 0
|
4月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
64 0
|
4天前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
22 0
|
4天前
|
程序员 Android开发
Android亮度调节的几种实现方法
Android亮度调节的几种实现方法
9 0
|
4天前
|
Shell Android开发
Android Activity重写dump方法实现通过adb调试代码
Android Activity重写dump方法实现通过adb调试代码
11 0
|
4天前
|
Android开发
Android APP 隐藏系统软键盘的方法
Android APP 隐藏系统软键盘的方法
11 0
|
4天前
|
Android开发
Android中去掉ActionBar的几种方法
Android中去掉ActionBar的几种方法
11 0
|
19天前
|
安全 Java Shell
Android11以上 Audio音频调试方法
Android11以上 Audio音频调试方法
58 0
|
1月前
|
Android开发
Android调用相机与相册的方法2
Android调用相机与相册的方法
24 0
|
1月前
|
Android开发
Android实现圆形图像的两种方法(Glide和Picasso)
Android实现圆形图像的两种方法(Glide和Picasso)
13 1