2012-05-08 44 views
8

我正在從Canvas上繪製類似於Android SDK的Finger Paint演示的應用程序。我的問題是當我使用PorterDuff.Mode.CLEAR。當繪圖和畫布,如果我試圖抹去的東西,它工作正常。但如果我試圖保存我的圖像作爲PNG文件,橡皮的筆觸顏色是黑色的,我不知道爲什麼會發生這種情況。這裏有一個例子我在做什麼:Android Paint PorterDuff.Mode.CLEAR

@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; 

這裏是圖像的一個例子:

這是我的畫布在保存前的樣子:

enter image description here

,這裏是圖像保存它SD卡後:

enter image description here

+0

什麼的Bitmap.Config你使用? RGB_565或RGBA_8888? – Renard

+0

'Bitmap.Config.ARGB_8888' –

+0

你可以在壓縮之前顯示你在mBitmap上繪製的代碼嗎? PortDuff清除意味着結果顏色爲0(黑色)。你偶然將油漆的α值設置爲零? – Renard

回答

12

與fingerpaint代碼的問題是,你看到的是不是被壓縮成PNG相同。看看onDraw()。首先你畫白色的屏幕。然後你添加位圖。因爲你使用Porter Duff清除已擦除的位圖部分實際上包含透明的黑色像素(值爲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); 
+0

非常感謝老兄!我改變了保存方法,現在它工作正常! –