在Android 2.3中编辑位图

时间:2012-03-21 18:50:42

标签: android canvas bitmap

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

我添加了“打开”和“保存”功能。 “save”功能使用getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)函数将位图存储到文件中,“open”功能启动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,所以你可以看看它(或者如果你因某种原因看不到它,请让我在这里发帖)。

谢谢!

2 个答案:

答案 0 :(得分: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);

我从帖子中知道这不是一种安全的方法,但现在它可行。

如果我在搜索中只使用了“inmutable bitmap”,我自己就会得到一个答案。不管怎样,谢谢!

答案 1 :(得分:0)

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