2011-04-04 14 views
47

Görünümümün ön izlemesini yapmak ve görüntü olarak kaydetmek için bir görünümü bir bitmap'e dönüştürmem gerekiyor. Aşağıdaki kodu kullanmayı denedim, ancak boş bir görüntü oluşturur. Nerede hata yaptığımı anlayamıyorum.Android'de bitmap'i görünümüne dönüştür

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

benim bakış (a LayoutInflater gelen şişirilmiş edilmiş) bir ViewGroup çünkü çoğu olarak çözüm benim için işe yaramadı :)

cevap

123

burada çözümdür. View.getMeasuredWidth (Yükseklik) ile doğru görüntü boyutunu elde etmek için görünüm boyutunu hesaplamak için view.measure çağırmak gerekiyordu.

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; 
} 
+4

Bu, kabul edilen yanıt olmalıdır –

+0

Gil SH, lütfen yukarıdaki snippet'i tanımlayabilir misiniz? –

+0

Tamam, ben düzenledim ve yorum ekledi –

27

Enjoy:

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) 
{     //   
    }  
    } 
+0

Çok teşekkür ederim! – Dehumanizer

+0

Uygulamamda çalışıyor. Teşekkür ederim! – lovefish

2

Tuval üzerine çizim kullanan tüm yanıtlar bir GLSurfaceView ile çalışmaz.

Bir GLSurfaceView içeriğini bir bitmap içine kaydetmek için, Renderer::onDrawFrame() içinde gl.glReadPixels ile özel bir yöntem uygulamayı düşünmelisiniz.

Bir çözüm snippet'i here gönderilmiştir.