在Android 2.3中编辑位图

在Android 2.3中编辑位图,android,canvas,bitmap,Android,Canvas,Bitmap,我正在Android上制作一个简单的绘图应用程序。我使用ApiDemos示例提供的FingerPaint.java作为基础,添加了一些特性,去掉了其他特性。它基本上创建了一个带有位图的画布,可以在上面绘制 我添加了“打开”和“保存”功能。“保存”功能使用getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)函数将位图存储到文件中,“打开”功能启动startActivityForResult(photoPickerIn

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

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

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

我很确定这是一个非常简单的问题,因为我不了解画布和位图是如何工作的。不管怎样,这是我的代码

创建自定义视图时:

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

        }
    }
}
mCanvas = new Canvas(mBitmap);
我认为我的错误在这段代码中,但如果有人认为这可能是我实际绘制的方式,我还没有修改FingerPaint.java示例中的touch_xxx和onTouchEvent,因此您可以查看它(或者如果您出于某种原因看不到它,请让我在这里发布)


谢谢

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

好,解决它

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

    @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();
            }

        }
    }
}
mCanvas = new Canvas(mBitmap);
我仍然不太清楚为什么这是必要的,但我知道没有这条线是不行的

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

我使用了第二种方法,即将位图复制到新的位图中,如下所示:

mBitmap = mBitmap.copy(Config.ARGB_8888, true);
我从帖子上知道,这不是一种安全的方法,但目前它是有效的


如果我在搜索中使用“inmutable位图”,我就会自己找到答案。无论如何谢谢你

谢谢,但这并不能完全解决问题。问题是,当我使用open函数加载位图时,位图会显示在屏幕上,但我在上面绘制的任何内容都会在我将手指从屏幕上提起时消失。如果单击“保存”,位图将在不进行任何修改的情况下存储,因此我相当确定,存储图像的方式没有问题,而是加载新位图的方式有问题。