2013-02-21 16 views
5

Mam pewne problemy z umieszczeniem zawartości płótna w bitmapie. Kiedy próbuję to zrobić, plik zostanie zapisany z rozmiarem pliku około 5,80 KB, ale wydaje się być całkowicie pusty (każdy piksel to "# 000").Zapisywanie obrazu canvas na bitmapie na Androidzie

Obszar roboczy rysuje serię połączonych linii, które tworzą pismo ręczne. Poniżej znajduje się mój onDraw do widoku. (Zdaję sobie sprawę, że blokuje wątek UI/złe praktyki itp., Ale po prostu muszę go uruchomić)

Dziękuję.

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

     } 
    } 

Odpowiedz

0

Może być

canvas.setBitmap(toDisk); 

nie znajduje się w odpowiednim miejscu.

Spróbuj tego:

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

Nie, niestety to nie działa. Dzięki za napiwek. –

4

Musisz narysować po ustawiając bitmapę na płótnie. Również użyć nowego obiektu Canvas takiego:

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

Polecam używanie PNG do zapisywania obrazów ścieżek.

+1

Dzięki za informację zwrotną, jeśli operacja ta miała zostać usunięta z metody onDraw() za pomocą wątku lub AsyncTask lub czegoś podobnego, to w jaki sposób obiekt canvas onDraw (Canvas) zostałby do nich przesłany? Czy mogę zastosować procedurę canvas.setBitmap()? Dzięki. –

+0

@ArronJeffery Zmieniono moją odpowiedź. –

+0

@ DheerajV.S. Mam to samo: stworzyłem płótno z bitmapą i narysowałem ścieżkę. Jest wyświetlany poprawnie (przy użyciu ImageView.setImageBitmap), ale Bitmap.compress zwraca wartość null i tworzony jest niepoprawny plik. – vedant1811

2

musisz zadzwonić canvas.setBitmap(bitmap); zanim zaczniesz rysować na płótnie. Po wywołaniu canvas.setBitmap(bitmap); narysuj na Canvas, a następnie zapisz Bitmap, którą przekazałeś do Canvas.

+0

Cześć, dziękuję za informację zwrotną. Próbowałem tego nie osiągać żadnych sukcesów, ponieważ po zastosowaniu tej zasady otrzymuję wyjątek UnsupportedOperationException. Zrzut ekranu: http://i.imgur.com/eHHzY5Z.png. Należy to zrobić w prawo onDraw metoda? Jak inaczej można uzyskać uchwyt "płótna"? –

3

najpierw utworzyć pustą bitmapę, a następnie utworzyć płótno z tą pustą bitmapę

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

teraz wyciągnąć swoje linie na płótnie

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

Teraz dostęp do bitmapy poprzez bitmap_object

11

Miałem podobny problem i mam rozwiązanie. Oto pełny kod zadania/Nie zapomnij o android.permission.WRITE_EXTERNAL_STORAGE pozwolenie w oczywisty/

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); dzięki. – Harry

+0

uzyskiwanie puste png –

Powiązane problemy