2012-05-08 13 views
8

Estoy trabajando en la aplicación que está dibujando en Canvas similar a la demostración de Finger Paint de Android SDK. Mi problema es cuando estoy usando PorterDuff.Mode.CLEAR. Cuando dibujo y lienzo, y si intento borrar algo, funciona bien. Pero si intento guardar mi imagen como archivo PNG, los trazos del borrador son de color negro, y no estoy seguro de por qué sucede esto. Este es un ejemplo de lo que estoy haciendo: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); 
    } 

borrador:

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

Y cómo estoy guardar la imagen:

  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; 

Y aquí es un ejemplo de las imágenes:

aquí es cómo se ve mi lienzo antes de guardar:

enter image description here

y aquí está la imagen después de guardar en la tarjeta SD:

enter image description here

+0

cuál es el Bitmap.Config que son ¿utilizando? RGB_565 o RGBA_8888? – Renard

+0

'Bitmap.Config.ARGB_8888' –

+0

¿Puedes mostrar el código donde dibujas en mBitmap justo antes de comprimirlo? También PortDuff clear significa que el color del resultado es 0 (negro). ¿Estás por casualidad poniendo el alfa de la pintura a cero? – Renard

Respuesta

12

El problema con el código de dedos es que lo que se ve no es lo mismo que se comprime en el PNG. Mira onDraw(). Primero dibuja la pantalla en blanco. Luego agrega el mapa de bits. Como utilizó Porter Duff Clear, la parte borrada del mapa de bits contiene píxeles negros realmente transparentes (valor 0x00000000). Pero debido a que tiene el fondo blanco, estos píxeles negros se muestran en color blanco.

Para solucionar este problema, ya sea cambiar su código para salvar a hacer lo mismo que el código de empate

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

o no utilice PortDuff.Clear:

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

Muchas gracias amigo! Cambio el método de guardado y ahora funciona correctamente. –

Cuestiones relacionadas