缩放画布后位图质量丢失

4

我希望在画布上绘制一个缩放后的位图(基于位图和视图大小)。问题在于,如果在绘制位图之前对画布进行缩放:

 canvas.scale(1.5f,1.5f);
 canvas.drawBitmap(mBitmap, 0, 0, paint);

这是结果: 锯齿状图像 但如果我缩放位图而不是画布:
Bitmap scaled = Bitmap.createScaledBitmap(
        mBitmap, bitmapWidth, bitmapHeight,
        true);
canvas.drawBitmap(scaledBitmap, 0, 0, paint);

结果要好得多: 正确缩放的图像 问题是位图非常大,在内存中同时拥有原始位图和缩放位图可能会有问题。
是否有办法在位图或视图边界更改时不每次创建缩放位图而获得第二个结果?

你是否为你的Paint对象设置了FILTER_BITMAP_FLAGANTI_ALIAS_FLAG - Vladimir Mironov
缺少FILTER_BITMAP_FLAG是问题所在。谢谢! - Addev
3个回答

1
在绘制画布时,使用包含缩放信息的矩阵。
canvas.drawBitmap(x,y,..., matrix...)

1

在从源读取位图并按比例缩放时,使用BitmapOptions中的inSampleSize(作为额外参数传递)。

这是Android几乎所有情况下加载图像的首选方式,以避免内存溢出,因为完整图像永远不会加载到内存中。

有关高效加载位图的Android文档可以在此处找到。

提供了示例代码,演示如何从源(资源、文件等)检索所需大小的图像。

高效加载大型位图中的两种方法正是您要寻找的。


1
我的问题的解决方案是,Paint没有启用FILTER_BITMAP_FLAG标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接