2013-02-21 42 views
5

Tôi đang gặp một số khó khăn khi đặt nội dung của Canvas vào một Bitmap. Khi tôi cố gắng làm điều này, tệp được viết với kích thước tệp khoảng 5.80KB nhưng tệp này dường như trống hoàn toàn (mỗi pixel là '# 000').Lưu canvas vào bitmap trên Android

Canvas vẽ một chuỗi các đường liên kết được tạo thành bằng chữ viết tay. Dưới đây là onDraw của tôi cho Chế độ xem. (Tôi biết rằng nó đang chặn chuỗi giao diện người dùng/thực tiễn không tốt/v.v., tuy nhiên tôi chỉ cần làm cho nó hoạt động)

Cảm ơn bạn.

@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.onDraw(canvas); 

     if (IsTouchDown) { 

      // Calculate the points 
      Path currentPath = new Path(); 
      boolean IsFirst = true; 
      for(Point point : currentPoints){ 
       if(IsFirst){ 
        IsFirst = false; 
         currentPath.moveTo(point.x, point.y); 
        } else { 
         currentPath.lineTo(point.x, point.y); 
        } 
       } 

      // Draw the path of points 
      canvas.drawPath(currentPath, pen); 

      // Attempt to make the bitmap and write it to a file. 
      Bitmap toDisk = null; 
      try { 

       // TODO: Get the size of the canvas, replace the 640, 480 
       toDisk = Bitmap.createBitmap(640,480,Bitmap.Config.ARGB_8888); 
       canvas.setBitmap(toDisk); 
       toDisk.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File("arun.jpg"))); 

      } catch (Exception ex) { 


      } 

     } else { 

      // Clear the points 
      currentPoints.clear(); 

     } 
    } 

Trả lời

0

Có thể

canvas.setBitmap(toDisk); 

không phải là ở vị trí chính xác.

Hãy thử điều này:

toDisk = Bitmap.createBitmap(640,480,Bitmap.Config.ARGB_8888);    
toDisk.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(new File("arun.jpg"))); 

canvas.setBitmap(toDisk); 
+0

Không, tiếc là nó không hoạt động. Cảm ơn các mẹo mặc dù. –

4

Bạn sẽ phải vẽ sau thiết lập các định dạng bitmap lên canvas. Cũng sử dụng đối tượng Canvas mới như sau:

Canvas canvas = new Canvas(toDisk); 
canvas.drawPath(currentPath, pen); 
toDisk.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(new File("arun.png"))); 

Tôi khuyên bạn nên sử dụng PNG để lưu hình ảnh đường dẫn.

+1

Cảm ơn phản hồi, nếu thao tác này được đưa ra khỏi phương thức onDraw(), sử dụng một Chủ đề hoặc AsyncTask hoặc một cái gì đó, thì đối tượng canvas onDraw (Canvas) sẽ được truyền qua chúng như thế nào? Để tôi có thể áp dụng thói quen canvas.setBitmap()? Cảm ơn. –

+0

@ArronJeffery Đã chỉnh sửa câu trả lời của tôi. –

+0

@ DheerajV.S. Tôi có cùng một thứ: tạo một canvas với một bitmap và vẽ một đường dẫn. Nó được hiển thị đúng (sử dụng ImageView.setImageBitmap) nhưng Bitmap.compress trả về null và một tệp không hợp lệ được tạo ra. – vedant1811

2

bạn phải gọi canvas.setBitmap(bitmap); trước khi vẽ bất kỳ thứ gì trên Canvas. Sau khi gọi canvas.setBitmap(bitmap);, hãy vẽ trên Canvas và sau đó lưu Bitmap bạn đã chuyển đến Canvas.

+0

Xin chào, cảm ơn vì phản hồi. Tôi đã thử điều này để không thành công khi tôi tiếp tục nhận được một UnsupportedOperationException khi tôi áp dụng điều này. Ảnh chụp màn hình: http://i.imgur.com/eHHzY5Z.png. Điều này phải được thực hiện trong phương thức onDraw phải không? Làm cách nào khác bạn có thể có được xử lý 'canvas'? –

3

đầu tiên tạo ra một bitmap trống, sau đó tạo ra một khung với bitmap trống

Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
Bitmap bitmap_object = Bitmap.createBitmap(width, height, conf); 
Canvas canvas = new Canvas(bitmap_object); 

tại vẽ đường của bạn trên vải

 Path currentPath = new Path(); 
     boolean IsFirst = true; 
     for(Point point : currentPoints){ 
      if(IsFirst){ 
       IsFirst = false; 
        currentPath.moveTo(point.x, point.y); 
       } else { 
        currentPath.lineTo(point.x, point.y); 
       } 
      } 

     // Draw the path of points 
     canvas.drawPath(currentPath, pen); 

Bây giờ truy cập bitmap của bạn thông qua bitmap_object

11

Tôi đã có vấn đề tương tự và tôi đã có giải pháp. Đây là mã đầy đủ của một tác vụ/đừng quên sự cho phép của android.permission.WRITE_EXTERNAL_STORAGE trong tệp kê khai/

public Bitmap saveSignature(){ 

     Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 
     this.draw(canvas); 

     File file = new File(Environment.getExternalStorageDirectory() + "/sign.png"); 

     try { 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(file)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return bitmap; 
    } 
+1

this.draw (canvas); cảm ơn. – Harry

+0

nhận png trống –

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