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

总结

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

相关文章
|
15天前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
40 2
基于Android P,自定义Android开机动画的方法
|
15天前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
61 2
|
15天前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
35 1
|
14天前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
119 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
4月前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
382 0
|
21天前
|
Android开发
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
26 0
|
21天前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
13 0
|
2月前
|
Android开发
Android面试题之View的invalidate方法和postInvalidate方法有什么区别
本文探讨了Android自定义View中`invalidate()`和`postInvalidate()`的区别。`invalidate()`在UI线程中刷新View,而`postInvalidate()`用于非UI线程,通过消息机制切换到UI线程执行`invalidate()`。源码分析显示,`postInvalidate()`最终调用`ViewRootImpl`的`dispatchInvalidateDelayed`,通过Handler发送消息到UI线程执行刷新。
36 1
|
2月前
|
消息中间件 调度 Android开发
Android经典面试题之View的post方法和Handler的post方法有什么区别?
本文对比了Android开发中`View.post`与`Handler.post`的使用。`View.post`将任务加入视图关联的消息队列,在视图布局后执行,适合视图操作。`Handler.post`更通用,可调度至特定Handler的线程,不仅限于视图任务。选择方法取决于具体需求和上下文。
38 0
|
3月前
|
存储 Java Android开发
Android上在两个Activity之间传递Bitmap对象
Android上在两个Activity之间传递Bitmap对象
27 2