17

我想在比实际尺寸更大的画布上绘制位图。我可以使用 canvas.drawBitmap(bitmap, null, destRect, null); 但是如果源图像明显小于目标矩形,则质量会很差,因为结果是像素化的。

如何使用双线性或双三次重采样绘制位图?

任何帮助将不胜感激,thanx。

4

2 回答 2

37

您需要在您的绘画中设置 FILTER_BITMAP_FLAG 标志。

canvas.drawBitmap(bitmap, matrix, null); //ugly jaggies unless scale is 1:1, but fast

或者

Paint paint = new Paint();
paint.setFilterBitmap();
canvas.drawBitmap(bitmap, matrix, paint); // pretty but slower (not too slow, usually)

这同样适用于该方法的其他(语法糖)形式drawBitmap

大多数 Android 绘图选项都没有任何文档,也没有用于渲染的底层原生 Skia 库的文档。如果有的话我会更开心。您可以在 Google Code Search 上搜索 Skia 源代码。搜索 Skia 并挖掘原始来源;这是唯一的文档。

于 2010-03-25T19:57:48.137 回答
1

在大多数情况下,FILTER_BITMAP_FLAG 不适用于缩减。

良好的缩小算法(不是最近邻)仅包含 2 个步骤(加上计算输入/输出图像裁剪的精确 Rect):

  1. 使用BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource()尽可能接近您需要的分辨率但不小于它的分辨率
  2. 通过使用Canvas::drawBitmap()缩小一点来获得精确的分辨率

以下是 SonyMobile 如何解决此任务的详细说明:https ://web.archive.org/web/20140228024414/http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-你的安卓应用程序/

这是 SonyMobile scale utils 的源代码:https ://web.archive.org/web/20140227233706/http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-安卓/

于 2014-04-21T02:13:45.910 回答