Convertir vista a bitmap en Android

Necesito convertir una vista a un bitmap para obtener una vista previa de mi vista y guardarla como una imagen. Intenté usar el siguiente código, pero crea una imagen en blanco. No puedo entender dónde cometí un error.

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

aquí está mi solución:

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

Disfruta 🙂

La solución más votada no funcionó porque mi vista es un ViewGroup (se ha inflado desde un LayoutInflater). Necesitaba llamar a view.measure para forzar que se calcule el tamaño de la vista para obtener el tamaño de vista correcto con 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; } 

Todas las respuestas que usen el dibujo en el canvas no funcionarán con GLSurfaceView.

Para capturar el contenido de un GLSurfaceView en un bitmap, debe considerar implementar un método personalizado con gl.glReadPixels dentro de Renderer :: onDrawFrame () .

Se ha publicado un fragmento de solución aquí .

Aquí hay una extensión en Kotlin inspirada en: Google Android Maps Utils Icon Generator

 fun View.convertToBitmap(): Bitmap { val measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) measure(measureSpec, measureSpec) layout(0, 0, measuredWidth, measuredHeight) val r = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888) r.eraseColor(Color.TRANSPARENT) val canvas = Canvas(r) draw(canvas) return r }