[摘]Android对Bitmap缩放图片的记录

Android  摘抄  2022年11月30日 am11:40发布2年前 (2022)更新 91es.com站长
123 0 0

前言

Android项目中经常需要调整图片的尺寸大小以适应存储、传输和图片处理等需求。虽然Android API中提供了一些缩放图片的方法,在调试中发现,使用Android API中的CanvasBitmapFactoryThumbnailUtils等类的相关方法缩放图片,锯齿感明显,图像质量不高。

这里记录一下对图片的缩放代码,方便自己查阅。

PS: 本文摘抄的。

正文

使用Canvas

创建一个Canvas对象,使用Canvas的drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)方法,根据Rect dst指定bitmap绘制在canvas上的位置,从而改变bitmap的大小。需要注意的是,使用这种方法时,为了得到更好效果的输出,要添加抗锯齿处理。

/**
     * 使用Canvas
     * @param bitmap 原始的Bitmap
     * @param rect Bitmap被缩放放置的Rect
     * @return 缩放后的Bitmap
     */
    public static Bitmap scaleCanvas(Bitmap bitmap, Rect rect) {
        Bitmap newBitmap = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ARGB_8888);//创建和目标相同大小的空Bitmap
        Canvas canvas = new Canvas(newBitmap);
        Paint paint = new Paint();
        Bitmap temp = bitmap;

        //针对绘制bitmap添加抗锯齿
        PaintFlagsDrawFilter pfd= new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
        paint.setFilterBitmap(true); //Bitmap进行滤波处理
        paint.setAntiAlias(true);//设置抗锯齿
        canvas.setDrawFilter(pfd);
        canvas.drawBitmap(temp, null, rect, paint);

        return newBitmap;
    }

使用Matrix

Bitmap实际上就是由像素点组成的矩阵,在Android中的Matrix主要用于对图像缩放、平移和旋转处理操作,Matrix对象调用postScale(float sx, float sy)方法设置缩放,在Bitmap的createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)方法中将Matrix对象传入,即可根据Matrix规则生成新的Bitmap。

    /**
     * 使用Matrix
     *
     * @param bitmap 原始的Bitmap
     * @param width  目标宽度
     * @param height 目标高度
     * @return 缩放后的Bitmap
     */
    public Bitmap scaleMatrix(Bitmap bitmap, int width, int height) {
        float scaleW = width * 1.0f / bitmap.getWidth();
        float scaleH = height * 1.0f / bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.postScale(scaleW, scaleH);// 长和宽放大缩小的比例
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }

使用ThumbnailUtils

ThumbnailUtils是Android API提供的获取缩略图的工具类,所以可以很容易地获得缩放后的Bitmap,使用该类中extractThumbnail(Bitmap source, int width, int height)方法返回获得缩放的Bitmap,该方法的参数中,source指输入待缩放的原始Bitmap,width和height分别指目标宽度和高度。

ThumbnailUtils.extractThumbnail(bitmap, width, height);

参考文章

  1. Android中缩放图片的方法_TuGeLe的博客-CSDN博客_android 图片缩放

 历史上的今天

  1. 2023: 《MySQL基础教程》笔记5(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

梁小斌:中国,我的钥匙丢了

中国,我的钥匙丢了。 那是十多年前,我沿着红色大街疯狂地奔跑,我跑到了郊外的荒野上欢叫,后来,我的钥匙丢了。 心灵,苦难的心灵,不愿再流浪了,我想回家打开抽屉、翻一翻我儿童时代的画片,还看一看那夹在书页里的翠绿的三叶草。 而且,我还想打开...

监听和获取Android 设备的USER_UNLOCKED状态

前言Android有些功能需要user unlocked之后才能使用,因此在启动前需要判断一下当前Android设备是否unlocked。这简单记录一下,方便自己查阅。正文判断isUserUnlocked启动某些功能时通过下面方式判断一下是否已经可以启动了。public boolean...

startActivity之进程启动

前言今天简单的记录一下App进程的启动过程。继之前startActivity的分析(《startActivity源码分析1》和《startActivity源码分析2》)中的进程启动是一带而过的,聪明的你会发现,进程启动的大部分跟《Zygote的启动之二ZygoteInit》重合了。正文回到...

丰子恺:人生三十即是秋

我的年岁上冠用了“三十”二字,至今已两年了。不解达观的我,从这两个字上受到了不少的暗示与影响。虽然明明觉得自己的体格与精力比二十九岁时全然没有什么差异。但“三十”这一个观念笼在头上,犹之张了一顶阳伞,使我的全身蒙了一个暗淡色的阴影,又仿佛在日历上撕过了立秋的一页以后,虽然太阳的炎威依然没有减却,...

[代码片段]Android像素转换工具类

前言移动项目需要根据设备进行适配,这个还是很有用的,摘抄于此,方便自己查阅。正文public class DensityUtil { public static int dip2px(float dpValue) { return (int) (dpValue * R...

王安忆:洗澡

行李前的马路上没有一棵树,太阳就这样直晒下俩。他已经将八大包书捆上了自行车,自行车再也动不了了。那小伙子早已注意他了,很有信心地骑在他的黄鱼车上,他徒劳地推了推车,车却要倒,扶也扶不住。小伙子超前骑了半步,又朝后退了半步,然后说:“师傅要去哪里?”他看了那人一眼停了一下,才说:“静安寺。”小伙子就说...