2012-05-19 9 views
5

Estoy trabajando con imágenes de gran tamaño y cuando intento girarlas (applying matrix on the bitmap) ocurren muchos segundos. He visto que la galería del sistema Android puede realizar esta tarea de una manera muy rápida. ¿Como es posible?La forma más rápida de rotar un mapa de bits de gran tamaño

Pensé realizar la rotación en un asyncTask, aplicando solo la rotación de ImageView (que no lleva mucho tiempo) en el hilo principal, pero si la aplicación se elimina antes de que asyncTask llegue al final, la aplicación caerá en un estado inconsistente

Este es mi código de la rotación de mapa de bits, que toma la ejecución de mucho tiempo para grandes mapas de bits:

Matrix mat = new Matrix(); 
mat.setRotate(90); 
bMap = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true); 

Respuesta

3

Al hacer modificaciones a una imagen de gran tamaño, cree una copia de baja mapa de bits de calidad de la misma y lo utilizan para mostrar la rotación instantánea u otros efectos de edición. Una vez que el usuario se detiene el movimiento (o el control deslizante izquierdo), reemplace el mapa de bits de baja calidad con la imagen original con los mismos efectos aplicados. Esto mejorará significativamente la experiencia del usuario. Prueba y avísame.

Esto puede sonar como una desviación del requisito original: puede dibujar un rectángulo en lugar de girar toda la imagen en tiempo real. Al final, lo que el usuario necesita es una indicación de cuánto ha girado su imagen. Esto será más rápido y se puede hacer fácilmente en el hilo de UI sin retraso.

Esta es la rotación simple en el código de lona

canvas.save(); //save the position of the canvas 
canvas.rotate(angle, X + (imageW/2), Y + (imageH/2)); //rotate the canvas 
canvas.drawBitmap(imageBmp, X, Y, null); //draw the image on the rotated canvas 
canvas.restore(); // restore the canvas position. 
+0

Esta es una buena idea para mejorar la experiencia del usuario, por supuesto. Pero el principal problema es que cuando trabajo en la imagen original al final, la tarea puede requerir mucho tiempo para completarse y tengo estas complicaciones: - si realizo la operación en el hilo principal, el usuario tiene que esperar - si realizo la operación en un asyncTask, la aplicación debe ser eliminada antes de su finalización y los cambios se perderán –

+0

Esto podría sonar como una desviación del requisito original: puede dibujar un rectángulo en lugar de girar toda la imagen en tiempo real . al final, lo que el usuario necesita es una indicación de cuánto ha girado su imagen. Esto será más rápido y fácil de hacer en el subproceso de interfaz de usuario sin retraso. – Ronnie

+0

Disculpe por el malentendido, mi pregunta es: "Cómo realizar la rotación de mapa de bits de manera rápida, como la galería del sistema es capaz de hacer". De todos modos, estoy muy confundido por tus consejos. Lo que necesito al final es realizar la rotación en el mapa de bits de gran tamaño, no darle al usuario una indicación sobre la rotación como usted dijo. Además, dejo solo 90, 180, 270, 360 grados de rotación, tal como lo permite la galería. Gracias por su paciencia :) –

Cuestiones relacionadas