Se ha hablado mucho, pero mucho de como hacer crop (recortar) una imagen en Android. Si uno busca en Google, probablemente lo que encuentre es muchos posts y discusiones sobre el uso de una actividad de recorte que “normalmente” traen los devices. Se debe destacar que a pesar de que dicha Actividad se encuentra en el mismísio código fuente de Android, al ser una Actividad interna, no nos asegura de que se encuentre disponible en cualquier dispositivo y más aún, Google y sus ingenieros no recomiendan utilizarla. En todo caso, si usted lo que desea hacer es recortar una imagen a nivel de código, tal vez este script le pueda servir:
public static Bitmap cropBitmap(Bitmap original, int height, int width) { Bitmap croppedImage = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(croppedImage); Rect srcRect = new Rect(0, 0, original.getWidth(), original.getHeight()); Rect dstRect = new Rect(0, 0, width, height); int dx = (srcRect.width() - dstRect.width()) / 2; int dy = (srcRect.height() - dstRect.height()) / 2; // If the srcRect is too big, use the center part of it. srcRect.inset(Math.max(0, dx), Math.max(0, dy)); // If the dstRect is too big, use the center part of it. dstRect.inset(Math.max(0, -dx), Math.max(0, -dy)); // Draw the cropped bitmap in the center canvas.drawBitmap(original, srcRect, dstRect, null); original.recycle(); return croppedImage; }
Éste código es tomado del source del proyecto Android y modificado para poder ejecutarse como una función. El código origjnal se puede encontrar aqui.
y en el caso que no se encuentre en el dispositivo como nos daríamos cuenta. para avisar que la aplicacion no funciona es ese dispositivo.
saludos
Bueno, en teoría no “está disponible” ya que no existe ninguna constante que nos permita llamar a la actividad de Crop.
Ahora bien, esto es riesgoso, ya que como los ingenieros mismos lo dicen, esto es una funcionalidad interna. Lo que los desarrolladores que de todas maneras quieren usarlo, lo harían mediante el siguiente llamado:
Intent intent = new Intent(“com.android.camera.action.CROP”);
intent.setClassName(“com.android.camera”, “com.android.camera.CropImage”);
startActivity(intent);
En ese caso, sería encapsular ese código dentro de un try/catch y atrapar el ActivityNotFoundException. Al menos eso es lo que se me ocurre. Como no es una funcionalidad soportada, no hay forma de pedirle al SDK que nos indique si dicha funcionalidad está disponible o no.
muchas gracias por su respuesta , pero entonces no hay ninguna manera de hacer esto sin que sea riesgoso?.
he modificado un poco el codigo , lo que quiero hacer es con una imagen cortarla en 5 partes esto es lo que tengo pero las imagenes no quedan bien no quedan bien algunas ni quedan.
public static Bitmap cropBitmap(Bitmap original, int width, int height ,int indexX, int indexY)
{
Bitmap croppedImage = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(croppedImage);
Rect srcRect = new Rect(0, 0, original.getWidth(), original.getHeight());
Rect dstRect = new Rect(indexX , indexY, width, height);
int dx = (srcRect.width() – dstRect.width()) / 2;
int dy = (srcRect.height() – dstRect.height()) / 2;
//If the srcRect is too big, use the center part of it.
srcRect.inset(Math.max(0, dx), Math.max(0, dy));
// If the dstRect is too big, use the center part of it.
dstRect.inset(Math.max(0, -dx), Math.max(0, -dy));
// Draw the cropped bitmap in the center
canvas.drawBitmap(original, srcRect, dstRect, null);
return croppedImage;
}
Bitmap finalyas[] = new Bitmap[5];
int tam_fina=0;
for( int i = 0 ; i < 5 ; i++ )
{
tam_fina = tam_fina + tam;
Log.e("POINT 1", "("+(tam * i) +",0)");
Log.e("POINT 2", "("+tam_fina +","+heigft+")");
finalyas[i] = cropBitmap( finalya, tam_fina , heigft , tam * i , 0 );
}
finalya.recycle();
Muchas gracias, muy util.
Me tenido que modificar solo en la creacion del bitmap para que el fondo sea transparente:
Bitmap.Config.ARGB_8888