2012-05-08 4 views
8

저는 Android SDK의 Finger Paint 데모와 비슷한 Canvas에서 그리는 응용 프로그램에서 작업하고 있습니다. 내 문제는 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 카드에 저장 한 후 이미지를 경우 : fingerpaint 코드

enter image description here

+0

사용 하시겠습니까? RGB_565 또는 RGBA_8888? – Renard

+0

'Bitmap.Config.ARGB_8888' –

+0

압축하기 전에 바로 mBitmap에 그릴 코드를 표시 할 수 있습니까? 또한 PortDuff clear은 결과 색상이 0 (검은 색)임을 의미합니다. 우연히 페인트의 알파를 0으로 설정 하시겠습니까? – Renard

답변

12

문제는 당신이 참조하면 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 다음 Bitmap.Config는 당신이 무슨

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

고마워 많은 젠체하는 사람! 나는 저축 방법을 바꾸고 지금 제대로 작동하고있다 !!! –

관련 문제