2012-05-08 25 views
8

Tôi đang làm việc trên ứng dụng đang vẽ trên Canvas tương tự như bản trình diễn Finger Paint từ Android SDK. Vấn đề của tôi là khi tôi đang sử dụng PorterDuff.Mode.CLEAR. Khi vẽ và Canvas và nếu tôi cố xóa một thứ gì đó, nó hoạt động tốt. Nhưng nếu tôi cố gắng lưu hình ảnh của mình dưới dạng PNG, thì các nét của công cụ xóa có màu đen và tôi không chắc tại sao điều này lại xảy ra. Dưới đây là một ví dụ những gì tôi đang làm: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); 
    } 

Eraser:

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

Và làm thế nào tôi đang ghi hình ảnh:

  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; 

Và đây là một ví dụ về hình ảnh:

dưới đây là hình vẽ của tôi trông như thế nào trước khi lưu:

enter image description here

và đây là hình ảnh sau khi lưu nó vào thẻ sd:

enter image description here

+0

whats Bitmap.Config bạn sử dụng? RGB_565 hoặc RGBA_8888? – Renard

+0

'Bitmap.Config.ARGB_8888' –

+0

bạn có thể hiển thị mã nơi bạn vẽ lên mBitmap ngay trước khi bạn nén nó không? Ngoài ra PortDuff rõ ràng có nghĩa là màu kết quả là 0 (màu đen). Bạn có cơ hội thiết lập alpha của sơn bằng không? – Renard

Trả lời

12

Vấn đề với mã fingerpaint là những gì bạn thấy là không giống nhau mà được nén vào png. Nhìn vào onDraw(). Đầu tiên bạn vẽ màn hình trắng. Sau đó, bạn thêm Bitmap. Vì bạn đã sử dụng Porter Duff Xóa phần bị xóa của bitmap chứa các pixel đen thực sự trong suốt (giá trị 0x00000000). Nhưng bởi vì bạn có nền màu trắng, đen pixel này hiển thị màu trắng.

Để sửa lỗi này, hoặc thay đổi của bạn lưu mã để làm điều tương tự như mã bốc thăm

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

hoặc không sử dụng PortDuff.Clear:

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

Cảm ơn rất nhiều anh chàng! Tôi thay đổi phương pháp tiết kiệm và bây giờ nó hoạt động đúng cách !!! –

Các vấn đề liên quan