【问题标题】:Saving Bitmap drawn on Canvas保存在画布上绘制的位图
【发布时间】:2012-10-10 23:00:48
【问题描述】:

在我的应用程序中,我扩展了 ImageView 并覆盖了它的 onDraw() 方法。我正在使用颜色过滤器来操作位图以添加一些效果,如反转、灰度等。绘制位图后,我试图保存它,但我只能保存原始位图而没有添加效果。这是 onDraw() 和保存方法的代码:

protected void onDraw(Canvas canvas)
{
    Paint paint = mPaint;
    //cmf is the color matrix filter
    paint.setColorFilter(cmf);

    if(mBitmap != null)
    {
        canvas.drawBitmap(mBitmap, offsetW, offsetH, paint);
    }
}

位图保存代码:

 try
        {
            FileOutputStream fout = new FileOutputStream(path);

            mBitmap.compress(CompressFormat.JPEG, 100, fout);
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }

我做错了吗?任何帮助将不胜感激。

【问题讨论】:

  • 尝试调用方法invalidate()
  • 为什么要保存位图?如果它们变化很大,您可以保存油漆并重新使用它们。如果保存很多位图,可能会遇到内存问题
  • @jay onDraw() 方法被调用,所以不需要调用 invalidate()。
  • @NikkyD 我仅在用户单击保存按钮时才保存位图。所以,内存在这里不是问题。问题是保存在位图上绘制的效果。

标签: android bitmap colormatrixfilter


【解决方案1】:

您正在显示的画布上绘画,原始位图没有改变。您应该创建一个新的位图并在其上绘画。当颜色矩阵过滤器改变时这样做:

Bitmap tmp = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap.getConfig())
Canvas canvas = new Canvas(tmp)
cnvas.drawBitmap(tmp, 0, 0, paint);

然后,你可以使用这个tmp位图来绘制它并保存它。

不要使用自定义的ImageView,而是使用普通的并将其图像设置为这个新的位图:

imageView.setImageBitmap(tmp)

【讨论】:

  • 是的...我已经尝试过这个解决方案,但是当我使用 setBitmap() 和 drawBitmap() 组合时,屏幕上什么也没有显示。屏幕保持空白。这就是我不使用 setBitmap() 的原因。我不知道原因,但这就是正在发生的事情。
  • setBitmap() 是什么意思?你怎么称呼这个?在onDraw() 中只需致电canvas.drawBitmap(tmp, offsetW, offsetH, paint); 查看我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
相关资源
最近更新 更多