algorithm optimization java-me image-manipulation midp

algorithm - Algoritmo de rotación de imagen



optimization java-me (8)

Graphics2D y AffineTransform te ayudarán a hacer exactamente lo que quieres. Específicamente, Graphics2D.drawImage (Image, AffineTransform) y AffineTransform.getRotateInstance. También puede hacer escalas, traslación y corte con esto. Ambas clases han estado en el tiempo de ejecución desde al menos 1.4 probablemente antes.

Estoy buscando un algoritmo que rote una imagen en algunos grados (entrada).

public Image rotateImage(Image image, int degrees)

(Las instancias de imagen podrían reemplazarse con int [] que contenga cada píxel de valores RGB. Mi problema es que necesito implementarlo para un proyecto JavaME MIDP 2.0, así que debo usar código ejecutable en JVM antes de la versión 1.5. ¿Alguien puede ayudarme con esto? ?

EDITAR: Olvidé mencionar que no tengo API SVG disponibles y que necesito un método para girar por un grado arbitrario distinto de 90 - 180 - 270

Además, no hay paquetes java.awt. * Disponibles en MIDP 2.0




Una de las mejores páginas que describen los algoritmos de rotación de imágenes que he encontrado en Internet está vinculada a la excelente biblioteca leptonica de Dan Bloomberg. Si bien la biblioteca de leptonica está escrita en C y no lo ayudará, su página sobre algoritmos de rotación de imágenes:

http://www.leptonica.com/rotation.html

Definitivamente vale la pena leer. Lo más probable es que desee implementar algo así como el algoritmo de Rotación por Área que describe en la segunda parte de la página.


LWUIT puede hacer eso y es de código abierto. Te sugiero que encuentres el código allí.


Solución general: para cada píxel en la imagen de destino, tome el píxel en la imagen de origen con las coordenadas del píxel de destino, giradas en la dirección opuesta.

Mejora de la solución: la rotación generalmente no dará coordenadas de píxeles exactas. Haga un promedio ponderado del píxel fuente con sus vecinos, de acuerdo con el porcentaje sobre el que se superponen.

Solución más rápida para imágenes binarias: convierta la imagen en "ejecuciones" de píxeles de primer plano consecutivos. Luego, rote los puntos finales de estas líneas y concéntrelas en el destino.

Normalmente, esto producirá breves vacíos debido al redondeo entero, por lo que cuando uno o ambos puntos finales están a más del 10% de un entero, remueva dos líneas para la línea fuente única, usando las coordenadas enteras redondeadas hacia arriba y hacia abajo.

Si un punto final está dentro del 10% y el otro no, las dos líneas formarán una ''V''. Si ambos están desactivados en más del 10%, las dos líneas formarán una ''X''.

Esto se puede hacer con respecto al eje X o el eje Y. Use el que tenga el ángulo más pequeño entre el eje y el ángulo de rotación. (Por ejemplo, si el ángulo de rotación está entre 45 y -45, use el eje X.)

Solución aún más rápida para imágenes binarias: si hay menos píxeles de fondo que píxeles de primer plano, rellene el destino con primer plano y siga el algoritmo anterior con píxeles de fondo.



public Image rotateImage(Image img, float degrees){ BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB); sourceBI.getGraphics().drawImage(img,0,0,null); AffineTransform at = new AffineTransform(); at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2); BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); return bio.filter(sourceBI, null); }