2013-02-21 8 views
5

Ho qualche difficoltà per quanto riguarda il posizionamento del contenuto di una tela in una bitmap. Quando provo a farlo, il file viene scritto con una dimensione del file di circa 5.80 KB, ma sembra completamente vuoto (ogni pixel è '# 000').Salvataggio del canvas su bitmap su Android

La tela disegna una serie di linee interconnesse formate a mano. Di seguito è il mio onDraw per la vista. (Sono consapevole che sta bloccando il thread dell'interfaccia utente/cattive pratiche/ecc., Tuttavia ho solo bisogno di farlo funzionare)

Grazie.

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

     } 
    } 

risposta

0

può essere

canvas.setBitmap(toDisk); 

non è nel posto giusto.

Prova questo:

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

No, purtroppo non ha funzionato. Grazie per il suggerimento però. –

4

dovrete disegnare dopo impostando la bitmap alla tela. Utilizzare anche un nuovo oggetto Canvas come questo:

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

Si consiglia di utilizzare PNG per salvare le immagini dei percorsi.

+1

Grazie per il feedback, se questa operazione doveva essere tolta dal metodo onDraw(), usando un Thread o AsyncTask o qualcosa del genere, in che modo l'oggetto canvas onDraw (Canvas) viene passato attraverso di essi? In modo che io possa applicare la routine canvas.setBitmap()? Grazie. –

+0

@ArronJeffery Modificato la mia risposta. –

+0

@ DheerajV.S. Ho la stessa cosa: creato una tela con una bitmap e disegnato un percorso. Viene visualizzato correttamente (utilizzando ImageView.setImageBitmap) ma Bitmap.com restituisce null e viene creato un file non valido. – vedant1811

2

è necessario chiamare canvas.setBitmap(bitmap); prima di disegnare qualsiasi cosa su Canvas. Dopo aver chiamato canvas.setBitmap(bitmap); disegnare su Canvas e quindi salvare il Bitmap passato a Canvas.

+0

Ciao, grazie per il feedback. Ho provato questo a nessun successo come continuo a ottenere un UnsupportedOperationException quando lo applico. Screenshot: http://i.imgur.com/eHHzY5Z.png. Questo deve essere fatto nel metodo onDraw giusto? Come in quale altro modo si può ottenere la maniglia 'tela'? –

3

prima creare una bitmap vuota, quindi creare una tela con quella bitmap vuota

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

ora disegnare le linee su tela

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

ora accedere bitmap tramite bitmap_object

11

Ho avuto un problema simile e ho una soluzione. Qui il codice completo di un compito/non dimenticare l'autorizzazione android.permission.WRITE_EXTERNAL_STORAGE nel manifest/

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 (tela); Grazie. – Harry

+0

ottenendo png vuoto –