2013-01-10 44 views
3

我想绘制画布中缩放的位图(基于位图和视图大小)。问题是,如果我画的位图前缩放画布:缩放画布后位图质量丢失

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

这是结果:

aliased image

但如果不是缩放画布我缩放位图:

Bitmap scaled = Bitmap.createScaledBitmap(
     mBitmap, bitmapWidth, bitmapHeight, 
     true); 
canvas.drawBitmap(scaledBitmap, 0, 0, paint); 

结果要好得多: Correctly scaled image

问题是位图非常大,并且在内存中原始和缩放的位图都可能有问题。

每当位图或视图边界发生变化时,是否有任何获取第二个结果而不创建缩放位图的方法?

+0

你为'Paint'对象设置了“FILTER_BITMAP_FLAG”和“ANTI_ALIAS_FLAG”吗? –

+0

缺少FILTER_BITMAP_FLAG是问题所在。谢谢! – Addev

回答

1

我的问题的解决方案是油漆尚未启用FILTER_BITMAP_FLAG标志。

1

请在源读取位图时,相应地扩大它(它是作为一个额外的参数传递)在BitmapOptions绘图画布

canvas.drawBitmap(x,y,..., matrix...) 
1

使用inSampleSize当包含缩放信息的矩阵。

这是androids首选在几乎所有情况下加载图像的方式,以避免内存溢出,因为完整图像从未加载到内存中。

Loading BItmaps efficiently can be found here.

Android的文档和范例代码就如何从源中检索所需大小的图像。 (资源,文件等)

Loading Large Bitmaps Efficiently这两种方法是你正在寻找的。