2011-05-17 6 views
5

Me gustaría comprobar las dimensiones de una imagen, y luego dimensionarla si el ancho excede un umbral dado. Cuando cargo una imagen JPEG de 6MB con ImageIO.read(), BufferedImage asigna aproximadamente 45MB de espacio de almacenamiento dinámico. ¿Hay alguna manera de hacer un cambio de tamaño de la imagen sin cargar todos los datos en la memoria? Traté de pasar ImageIO.read() un objeto File, pensando que transmitiría los datos del disco, pero no ayuda.¿Cómo cambiar el tamaño de una imagen sin cargarla en la memoria?

Respuesta

3

Consulte im4java y JMagick. Ambos usan una herramienta externa extremadamente eficiente llamada ImageMagick para manipulación de imágenes. Im4Java llama a la aplicación de línea de comandos (funciona en un proceso separado) y JMagick la llama dentro del mismo proceso a través de JNI.

Si estoy haciendo una simple manipulación de imágenes (cambio de tamaño, escalado, rotación, etc.), prefiero dejar que ImageMagick lo haga por mí. Será más rápido, más confiable y consumirá menos memoria que cualquier otra que implemente en un período de tiempo similar.

Espero que esto ayude!

+0

Gracias Ben. Veré las bibliotecas de ImageMagick para Java. –

+1

De acuerdo con Ben; si la alta eficiencia es la forma en que necesita ir, usar una solución nativa y llamar a Java es probablemente la única manera en que esto sucederá. Cambiar el tamaño de las imágenes es en realidad una operación de remuestreo; no puedes evitarlo El remuestreo requiere una selección de algoritmo de reducción y promediar los valores de píxel; Hacer esto en "fragmentos" en Java requerirá MUCHO código personalizado en la parte superior de ImageReadParam tirando en secciones a la vez, muestreándolos y combinando los resultados de manera eficiente. En resumen, * chupa *. –

+0

¡Gracias, Riyad! :-) –

1

Puede usar ImageInfo para verificar el ancho y alto de la imagen sin cargarla en la memoria. No sé de una biblioteca que le permita cambiar el tamaño sin cargar la imagen en la memoria. 45 MB no es tanta memoria realmente. ¿Puedes simplemente aumentar el tamaño de tu pila?

+9

"45 MB no es demasiado" ... depende de su plataforma de destino. – EboMike

+1

¡Escucha, escucha! ¡45 MB no admite interoperabilidad alta y dispositivos con memoria limitada! –

+0

cierto. Si su plataforma de destino no le permite cargar 45 MB, podría considerar realizar escalas de imagen en un servidor por separado. – dennisjtaylor

3

He usado jmagick antes con excelentes resultados, sin embargo, puede ser difícil hacerlo funcionar en diferentes entornos (colocando los frascos en el lugar correcto, asegurándote de que tienes la construcción correcta de imagemagick, etc.).

Es posible que desee considerar el uso de imgscalr (http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library). Es una biblioteca de código abierto de manipulación de imágenes Java disponible bajo la licencia de Apache 2.0. Mucho mucho (mucho ...) más fácil de usar y más rápido que ese horrendo material de Java2D.

Cuestiones relacionadas