studio framework example definicion android android-layout bitmap android-canvas

framework - view android definicion



Cómo crear un mapa de bits cuadrado a partir de un mapa de bits rectangular en Android (3)

Si usa un ImageView , puede agregar android:scaletype="centerInside" en el archivo xml. Esto pondrá la imagen centrada sin cambiar la escala. Pondrá más espacio donde sea necesario.

Siempre que coloque el layout_width y el layout_height de ImageView iguales, se layout_height .

También puede hacerlo mediante programación utilizando el setScaleType(ImageView.ScaleType scaleType) en ImageView. Se puede encontrar más sobre esto aquí

Básicamente, tengo un mapa de bits rectangular y quiero crear un nuevo mapa de bits con dimensiones cuadradas que contendrá el mapa de bits rectangular dentro de él.

Entonces, por ejemplo, si el mapa de bits de origen tiene ancho: 100 y alto: 400, quiero un nuevo mapa de bits con ancho: 400 y alto: 400. Luego, dibuje el mapa de bits de origen centrado dentro de este nuevo mapa de bits (consulte la imagen adjunta para una mejor comprensión).

Mi código a continuación crea el mapa de bits cuadrado bien, pero el mapa de bits de origen no se dibuja en él. Como resultado, me queda un mapa de bits completamente negro.

Aquí está el código:

Bitmap sourceBitmap = BitmapFactory.decodeFile(sourcePath); Bitmap resultBitmap= Bitmap.createBitmap(sourceBitmap.getHeight(), sourceBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(resultBitmap); Rect sourceRect = new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()); Rect destinationRect = new Rect((resultBitmap.getWidth() - sourceBitmap.getWidth())/2, 0, (resultBitmap.getWidth() + sourceBitmap.getWidth())/2, sourceBitmap.getHeight()); c.drawBitmap(resultBitmap, sourceRect, destinationRect, null); // save to file File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp"); File file = new File(mediaStorageDir.getPath() + File.separator + "result.jpg"); try { result.compress(CompressFormat.JPEG, 100, new FileOutputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); }

¿Alguna idea de lo que estoy haciendo mal?


Vaya, solo me di cuenta de cuál es el problema. Estaba dibujando el Bitmap de Bitmap incorrecto en el Canvas . Si ayuda a alguien en el futuro, recuerde que el Lienzo ya está adjunto y se pintará en el mapa de bits que especifique en su constructor. Así que básicamente:

Esta:

c.drawBitmap(resultBitmap, sourceRect, destinationRect, null);

En realidad debería ser:

c.drawBitmap(sourceBitmap, sourceRect, destinationRect, null);


Prueba esto:

private static Bitmap createSquaredBitmap(Bitmap srcBmp) { int dim = Math.max(srcBmp.getWidth(), srcBmp.getHeight()); Bitmap dstBmp = Bitmap.createBitmap(dim, dim, Config.ARGB_8888); Canvas canvas = new Canvas(dstBmp); canvas.drawColor(Color.WHITE); canvas.drawBitmap(srcBmp, (dim - srcBmp.getWidth()) / 2, (dim - srcBmp.getHeight()) / 2, null); return dstBmp; }