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

Android  摘抄  2022年11月30日 am11:40发布2年前 (2022)更新 城堡大人
130 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

adb查询和改变ContentProvider的值

前言项目中有用ContentProvider存储自定义的属性值,为了方便调试,因此想用adb shell 通过命令改变查看效果。其实之前也记录过相关的,只是没有亲自试验,摘抄文章《[摘]adb命令行查询content-provider -笔友城堡 - 阅读是一种生活方式 ()》。今天有空,重...

关闭Google chrome 更新提示

前言Win7电脑每次打卡Google Chrome,就会提示若要接收后续 Google Chrome 更新,您需使用 Windows 10 或更高版本。该计算机目前使用的是 Windows 7不会自动关闭,都需要手动点一下,很烦。因此在网上如何关闭这提示的方法,记录一下。正文下面是亲测...

俞平伯:浆声灯影里的秦淮河

我们消受得秦淮河上的灯影,当圆月犹皎的仲夏之夜。在茶店里吃了一盘豆腐干丝,两个烧饼之后,以歪歪的脚步踅上夫子庙前停泊着的画舫,就懒洋洋躺到藤椅上去了。好郁蒸的江南,傍晚也还是热的。“快开船罢!”桨声响了。小的灯舫初次在河中荡漾;于我,情景是颇朦胧,滋味是怪羞涩的。我要错认它作七里的山塘;可是,河...

Linux signal 常见的信号含义表

前言简单记录一下Linux signal 常见的信号含义。PS : 本文摘抄,只是方便自己查阅而已。正文信号表 SIGHUP       1       /* Hangup (POSIX). */                         终止进程     终端线路挂断S...

MediaPlayer源码介绍2

前言之前介绍MediaPlayer ,接上文《MediaPlayer JNI层介绍》(看做《MediaPlayer源码介绍1》)介绍到mediaplayer.cpp,这也是一个代理,真正处理的并不是这个。今天以setDataSource()为例继续分析。涉及代码frameworks\av\...

ATC平台编译命令记录

前言主要记录一下ATC项目中用的编译命令。方便自己查阅。主要是个人用,每个平台可能不一样。不推荐看哈正文在Android源码目录下隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参考文章1.《ATC 文档》