2011-04-04 3 views
47

Je dois convertir une vue en bitmap pour prévisualiser ma vue et l'enregistrer en tant qu'image. J'ai essayé d'utiliser le code suivant, mais cela crée une image vide. Je ne peux pas comprendre où j'ai fait une erreur.Convertir la vue en bitmap sur Android

View viewToBeConverted; Bitmap viewBitmap = Bitmap.createBitmap(viewToBeConverted.getWidth(), viewToBeConverted.getHeight(),Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(viewBitmap); 
viewToBeConverted.draw(canvas); 
savephoto(“f1”, viewBitmap); 

//// public void savephoto(String filename,Bitmap bit)  
    { 
      File newFile = new File(Environment.getExternalStorageDirectory() + Picture_Card/"+ filename+ ".PNG"); 
       try 
{ 
        newFile.createNewFile();     
try 
{ 
         FileOutputStream pdfFile = new FileOutputStream(newFile);            Bitmap bm = bit;       ByteArrayOutputStream baos = new ByteArrayOutputStream();       bm.compress(Bitmap.CompressFormat.PNG,100, baos);              byte[] bytes = baos.toByteArray();       
pdfFile.write(bytes);            
     pdfFile.close();     
} 
catch (FileNotFoundException e) 
{       //  

    }    
    } catch (IOException e) 
{     //   
    }  
    } 

Répondre

123

voici ma solution:

public static Bitmap getBitmapFromView(View view) { 
     //Define a bitmap with the same size as the view 
     Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888); 
     //Bind a canvas to it 
     Canvas canvas = new Canvas(returnedBitmap); 
     //Get the view's background 
     Drawable bgDrawable =view.getBackground(); 
     if (bgDrawable!=null) 
      //has background drawable, then draw it on the canvas 
      bgDrawable.draw(canvas); 
     else 
      //does not have background drawable, then draw white background on the canvas 
      canvas.drawColor(Color.WHITE); 
     // draw the view on the canvas 
     view.draw(canvas); 
     //return the bitmap 
     return returnedBitmap; 
    } 

Enjoy :)

+4

Ceci devrait être la réponse acceptée –

+0

Gil SH, pouvez-vous s'il vous plaît décrire snippet ci-dessus? –

+0

OK, je l'ai édité et ajouté des commentaires –

27

La solution la plus votée ne fonctionnait pas pour moi parce que mon avis est un ViewGroup (ont été gonflés d'un LayoutInflater). J'ai dû appeler view.measure pour forcer la taille de la vue à être calculée afin d'obtenir la taille d'affichage correcte avec view.getMeasuredWidth (Height).

public static Bitmap getBitmapFromView(View view) { 
    view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 
    Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), 
      Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 
    view.draw(canvas); 
    return bitmap; 
} 
+0

Merci beaucoup! – Dehumanizer

+0

Cela fonctionne sur mon application. Je vous remercie! – lovefish

2

Toutes les réponses utilisant le dessin sur le canevas ne fonctionneront pas avec un GLSurfaceView.

Pour capturer le contenu d'un GLSurfaceView dans un bitmap, vous devez envisager d'implémenter une méthode personnalisée avec gl.glReadPixels à Renderer::onDrawFrame().

Un extrait de solution a été publié here.