【问题标题】:Android Paint PorterDuff.Mode.CLEARAndroid Paint PorterDuff.Mode.CLEAR
【发布时间】:2012-05-16 16:34:22
【问题描述】:

我正在开发在 Canvas 上绘制的应用程序,类似于 Android SDK 中的 Finger Paint 演示。我的问题是当我使用PorterDuff.Mode.CLEAR 时。绘制和画布时,如果我尝试擦除某些东西,它工作正常。但是如果我尝试将我的图像保存为PNG 文件,橡皮擦的笔划会变成黑色,我不知道为什么会这样。这是我正在做的一个例子:

@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

        canvas.drawPath(mPath, mPaint);
    }

橡皮擦:

case ERASE_MENU_ID:
            mPaint.setXfermode(new PorterDuffXfermode(
                                                    PorterDuff.Mode.CLEAR));
            return true;

以及我如何保存图像:

            Calendar currentDate = Calendar.getInstance();
            SimpleDateFormat formatter= new SimpleDateFormat("yyyyMMMddHmmss");
            String dateNow = formatter.format(currentDate.getTime());
            File dir = new File(mImagePath);
            if(!dir.exists())
                dir.mkdirs();

            File file = new File(mImagePath + "/" + dateNow +".png");

            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.close();
                Toast.makeText(getApplicationContext(), "File saved at \n"+mImagePath + "/" + dateNow +".png", Toast.LENGTH_LONG).show();
            } catch (FileNotFoundException e) {
                Log.e("Panel", "FileNotFoundException", e);
            } 
            catch (IOException e) {
                Log.e("Panel", "IOEception", e);
            }
            return true;

这是一个图像示例:

这是我的画布在保存之前的样子:

这是保存到sd卡后的图片:

【问题讨论】:

  • 您使用的 Bitmap.Config 是什么? RGB_565 还是 RGBA_8888?
  • 您能否在压缩之前显示您在 mBitmap 上绘制的代码? PortDuff clear 也意味着结果颜色为 0(黑色)。您是否偶然将油漆的 alpha 设置为零?
  • 这是我实际使用的:developer.android.com/resources/samples/ApiDemos/src/com/… 我的文件看起来像这样,但还有一些功能。
  • 检查 android 网站 developer.android.com/reference/android/graphics/…,它说清除模式将颜色和 alpha 设置为 0。相反,我认为 XOR 将适用于您的场景(不确定)

标签: android bitmap android-canvas


【解决方案1】:

fingerpaint 代码的问题是你看到的和压缩成 png 的不一样。看看 onDraw()。首先你把屏幕画成白色。然后添加位图。因为您使用了 Porter Duff Clear,所以位图的擦除部分包含实际透明的黑色像素(值 0x00000000)。但是因为你有白色背景,这些 黑色 像素显示为白色。

要解决此问题,请更改您的保存代码以执行与绘制代码相同的操作

 try {
                    fos = new FileOutputStream(file);
                    Bitmap saveBitmap = Bitmap.createBitmap(mBitmap);
                    Canvas c = new Canvas(saveBitmap);
                    c.drawColor(0xFFFFFFFF);
                    c.drawBitmap(mBitmap,0,0,null);
                    saveBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    saveBitmap.recycle();
...

或者不要使用 PortDuff.Clear:

    case ERASE_MENU_ID:
        mPaint.setColor(Color.WHITE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多