8

AndroidSDKのFingerPaintデモに似たCanvasで描画しているアプリケーションに取り組んでいます。私の問題は、を使用しているときですPorterDuff.Mode.CLEAR。描画してCanvasを作成するときに、何かを消去しようとすると、正常に機能します。しかし、画像を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カードに保存した後の画像です:

ここに画像の説明を入力してください

4

1 に答える 1

12

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);
于 2012-05-08T08:25:22.217 に答える