【问题标题】:Editing a bitmap in Android 2.3在 Android 2.3 中编辑位图
【发布时间】:2012-03-22 18:31:47
【问题描述】:

我正在 Android 上制作一个简单的绘图应用程序。我使用 ApiDemos 示例提供的 FingerPaint.java 作为基础,添加了一些功能并去掉了其他功能。它基本上创建了一个带有位图的画布,您可以在上面绘制。

我添加了“打开”和“保存”功能。 “保存”功能使用 getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 功能将位图存储到文件中,“打开”功能启动 startActivityForResult(photoPickerIntent, 1) 并加载所选图像。

问题是我无法在手动打开的位图上绘图。用手指绘图时会显示一条痕迹,但一旦将手指从屏幕上抬起,该痕迹就会消失。如果我保存此位图,它将在图库中完全未修改地显示。但是在启动应用程序时,我可以在画布上正常绘制。

我很确定这是一个非常简单的问题,因为我对 Canvas 和 Bitmap 的工作原理缺乏了解。无论如何,这是我的代码。

创建自定义视图时:

    public MyView(Context c){

        super(c);

        mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);

    }

OnDraw 覆盖:

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(0xFFAAAAAA);
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
        canvas.drawPath(mPath, mPaint);
    }

我的“打开”功能:

    private void open(){
    //checkSD: 1 if read only, 2 if RW
    if(checkSD()==1 || checkSD()==2){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, 1);
    }
}

最后是我的 onActivityResult:

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //RequestCode:1 image
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            Uri selectedImage = data.getData();
            try{
                InputStream fIn = getContentResolver().openInputStream(selectedImage);
                mBitmap = BitmapFactory.decodeStream(fIn);
                fIn.close();
            } catch (Exception e){
                e.printStackTrace();
            }

        }
    }
}

我认为我的错误在这段代码中,但如果有人认为它可能是我实际绘制的方式,我没有修改 FingerPaint.java 示例中的 touch_xxx 和 onTouchEvent,所以你可以看看(如果由于某种原因看不到,请让我在此处发布)。

谢谢!

【问题讨论】:

    标签: android canvas bitmap


    【解决方案1】:

    好的,解决了!

    我做了两件事。第一个是在“fIn.close();”之后添加以下行onActivityResult 内部:

    mCanvas = new Canvas(mBitmap);
    

    我仍然不太清楚为什么这是必要的,但我知道如果没有这条线它就行不通。

    我做的第二件事是复制我正在加载的位图。原来 BitmapFactory.decodeStream() 返回一个不可变的位图,为了创建一个新的画布,需要一个可变的位图。我在这篇博文中找到了一个很好的解释:

    http://sudarnimalan.blogspot.com.es/2011/09/android-convert-immutable-bitmap-into.html

    我使用了第二种方法,将位图复制到一个新的,像这样:

    mBitmap = mBitmap.copy(Config.ARGB_8888, true);
    

    我从帖子中知道这不是一个安全的方法,但现在它有效。

    如果我在搜索中使用“不可变位图”,我会自己想出答案。还是谢谢你!

    【讨论】:

      【解决方案2】:

      从视图保存图像的另一种方法是在视图上启用绘图缓存,当用户单击保存时,您使用 getDrawingCache() 获取位图并保存它。

      【讨论】:

      • 谢谢,但这并不能完全解决问题。问题是,当我使用 open 函数加载位图时,位图会显示在屏幕上,但是当我将手指从屏幕上抬起时,我在其上绘制的任何内容都会消失。如果我单击“保存”,则位图会在没有任何修改的情况下存储,所以我相当确定这不是我存储图像的方式问题,而是我加载新位图的方式。
      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多