【问题标题】:Bitmap quality lost after scaling canvas缩放画布后位图质量丢失
【发布时间】:2013-01-10 07:29:43
【问题描述】:

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

 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);

结果要好得多:

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

有没有什么方法可以在每次 Bitmap 或 View 边界发生变化时不创建缩放 Bitmap 的情况下获得第二个结果?

【问题讨论】:

  • 您是否为您的Paint 对象设置了FILTER_BITMAP_FLAGANTI_ALIAS_FLAG
  • 缺少的 FILTER_BITMAP_FLAG 是问题所在。谢谢!

标签: java android bitmap


【解决方案1】:

绘制到画布时使用包含缩放信息的矩阵

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

【讨论】:

    【解决方案2】:

    在从源读取位图时使用BitmapOptions 中的inSampleSize 以相应地对其进行缩放(它作为额外参数传递)。

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

    Loading BItmaps efficiently can be found here. 上的 android 文档

    通过示例代码说明如何从您的源中检索所需大小的图像。 (资源、文件等)

    Loading Large Bitmaps Efficiently 中的两个方法就是你要找的。​​p>

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 2011-06-22
        相关资源
        最近更新 更多