¿Cuál es la mejor biblioteca / enfoque de procesamiento de imágenes Java? [cerrado]

244

¿Estoy usando tanto la API de medios JAI como ImageMagick?

ImageMagick tiene algunos problemas de escalabilidad y el JMagick basado en JNI tampoco es atractivo. JAI tiene resultados de baja calidad al realizar operaciones de cambio de tamaño en comparación con ImageMagick.

¿Alguien sabe de alguna herramienta excelente, ya sea de código abierto o comercial, que sea nativa de Java y ofrezca resultados de alta calidad?

Daniel Honig
fuente
55
JMagick casi no tiene documentación, excepto los javadocs. Acabo de pasar dos horas buscando algo que debería haber sido bastante fácil de hacer.
Alex Ciminian
En efecto. Elegí simplemente salir del proceso y usar ImageMagick usando apache exec como un medio para administrar el proceso. Esto funcionó bien. Podría haber ido tan lejos como para construir un servidor de imágenes solo para este propósito. Es difícil encontrar algo con la calidad y funcionalidad de ImageMagick.
Daniel Honig
158
Es ridículo que preguntas como esta se cierren como fuera de tema. Más de 100000 visualizaciones, es claramente una pregunta que la gente hace. A veces las personas no saben exactamente todo lo que van a hacer de antemano, y apreciarían las respuestas "obstinadas" de otras personas sobre el mejor marco general. Demasiada moderación grandiosa en SO!
user467257
12
¿Qué hay de malo si la gente discute los pros y los contras de las formas de un aspecto clave de la programación Java? ¿No se supone que debe hacer SO? En mi humilde opinión, tales preguntas deben ser moderadas y mantenidas cuidadosamente para proporcionar una buena referencia a los desarrolladores que comienzan de nuevo sobre el tema en particular.
Raúl
20
Sip. Resultado superior en Google java image processing librarypero cerrado ... como siempre. La moderación se está yendo por la borda en SO estos días.
Stijn de Witt

Respuestas:

88

Hay ImageJ , que se jacta de ser el

programa de procesamiento de imágenes Java puro más rápido del mundo

Se puede usar como biblioteca en otra aplicación. Su arquitectura no es brillante, pero realiza tareas básicas de procesamiento de imágenes.

Ivan
fuente
2
Yo uso ImageJ como una biblioteca en una serie de aplicaciones de procesamiento de imágenes. Es una biblioteca Java muy decente. También se integra muy bien con Java2D, por lo que puede mezclar y combinar los 2 con bastante facilidad.
hohonuuli
3
En el momento en que usé ImageJ, su API era bastante incómoda. Es más una aplicación para la que puede escribir complementos que una biblioteca. Y hasta donde recuerdo, intentar desarrollar una nueva GUI en esa antigua base de código AWT fue un fastidio.
Ivan
44
Acabo de perder medio día tratando de hacer una simple rotación de imagen, escala y recorte. Es 2019 y la documentación de ImageJ no es utilizable.
M. Leonhard
133

Sé que esta pregunta es bastante antigua, pero a medida que sale un nuevo software, ayuda a obtener algunos enlaces nuevos a proyectos que podrían ser interesantes para la gente.

imgscalr es una biblioteca de redimensionamiento de imágenes de Java puro (y operaciones simples como relleno, recorte, rotación, brillo / atenuación, etc.) que es dolorosamente simple de usar: una sola clase consiste en un conjunto de operaciones gráficas simples, todas definidas como métodos estáticos que pasas una imagen y obtienes un resultado.

El ejemplo más básico de uso de la biblioteca se vería así:

BufferedImage thumbnail = Scalr.resize(image, 150);

Y un uso más típico para generar miniaturas de imágenes usando algunos ajustes de calidad y similares podría ser así:

import static org.imgscalr.Scalr.*;

public static BufferedImage createThumbnail(BufferedImage img) {
    // Create quickly, then smooth and brighten it.
    img = resize(img, Method.SPEED, 125, OP_ANTIALIAS, OP_BRIGHTER);

    // Let's add a little border before we return result.
    return pad(img, 4);
}

Todas las operaciones de procesamiento de imágenes usan la canalización Java2D sin procesar (que es acelerada por hardware en las plataformas principales) y no introducirán el dolor de llamar a través de JNI como la contención de la biblioteca en su código.

imgscalr también se ha implementado en producciones a gran escala en bastantes lugares: la inclusión de la clase AsyncScalr lo convierte en un complemento perfecto para cualquier procesamiento de imágenes del lado del servidor.

Existen numerosos ajustes en la calidad de imagen que puede utilizar para intercambiar velocidad y calidad con el modo ULTRA_QUALITY más alto que proporciona un resultado escalado que se ve mejor que la implementación Lancoz3 de GIMP.

Riyad Kalla
fuente
@Riyad Kalla parece interesante gracias ... Pero no lo entiendo, ¿puede usarse en proyectos comerciales?
user592704
2
@ user592704 Absolutamente, imgscalr tiene licencia de Apache 2; bajo la misma licencia, todo en la Fundación Apache tiene licencia. Puede tomarlo y hacer lo que quiera con él en productos de código abierto o comerciales. imgscalr ya está implementado en una serie de aplicaciones web comerciales en producción.
Riyad Kalla
1
@DavidParks Tiene razón, imgscalr está destinado a hacerse cargo una vez que tenga esa instancia de BufferedImage (datos de imagen decodificados), no antes. Ni siquiera quería considerar ir por el camino de intentar hacer mis propios decodificadores / codificadores, ya que esas tuberías han sido aceleradas por hardware desde hace mucho tiempo por el equipo de Java2D, tratando de rehacer todo ese trabajo sin errores y de manera eficiente sería una empresa hercúlea.
Riyad Kalla
1
@gstackoverflow imgscalr opera en las instancias de BufferedImage sin procesar (datos de imagen decodificados), por lo que algo más (generalmente la biblioteca ImageIO) necesita decodificar los datos de imagen codificados en BufferedImage y luego volver a codificarlos en una nueva imagen una vez que imgscalr haya terminado de funcionar en otras palabras: "a imgscalr no le importa el formato de archivo, ya ha decodificado la imagen antes de entregarla a imgscalr"
Riyad Kalla
1
ImgScalr solo es bueno para la manipulación básica de imágenes. Si se trata de carga y procesamiento de imágenes. Carece de la complejidad.
MarekM
31

Otra buena alternativa: Marvin

Joseph
fuente
99
Muchas gracias. ¡Salvaste mi día! : D (PD: no soy el OP. ¡Encontré esta publicación mientras busqué en Google y confía en mí, me ayudó mucho! (Te compraré una cerveza si te veo algún día)).
missingfaktor
3
@missingfaktor ahora te debo una cerveza. Tu alabanza a Joseph también me salvó el día. Joseph, ¡también te vas a tomar una cerveza :)!
Filip Dupanović
3
Al parecer, esa URL ya no existe, pero marvinproject.sourceforge.net parece ser la nueva URL.
Amos M. Carpenter
De acuerdo, estoy obligado a echarle un vistazo a ESTO. =)
Marvo
Se ve muy bien, lo intentaré.
Ridcully
8

El procesamiento es nuevo pero muy, muy bueno.

fmsf
fuente
1
Soy consciente del procesamiento, pero ¿la gente realmente lo está usando en el, me gustaría ir a ejecutar la transformación X en mi biblioteca de la moda de X jpeg?
Daniel Honig
Lo he usado y parece realmente poderoso y vale la pena apostar
fmsf
2
En realidad, las bibliotecas principales (que podrían usarse para integrar la funcionalidad) son LGPL. Pero nadie preguntó cuál es la licencia. wiki.processing.org/w/…
Benjamin Atkin
5

Intenta usar el Marco de Catalano .

Puntos clave:

  • Arquitectura como AForge.NET/Accord.NET.
  • Ejecutar en ambos entornos con el mismo código, escritorio y Android.
  • Contiene varios filtros en paralelo.
  • El desarrollo está a todo vapor.

Catalano Framework es un marco para la computación científica para Java y Android. El proyecto comenzó como un puerto inicial de las muchas características de los marcos AForge.NET y Accord.NET para .NET, pero está creciendo constantemente con características más avanzadas que ahora se comparten entre esos proyectos.

Ejemplo:

FastBitmap fb = new FastBitmap(bitmap);

Grayscale g = new Grayscale();
g.applyInPlace(fb);

Threshold t = new Threshold(120);
t.applyInPlace(fb);

bitmap = fb.toBitmap();

//Show the result
Diego Catalano
fuente
66
The best framework in Java is Catalano Frameworkeso suena como si estuvieras anunciando tu propio producto. Su marco puede ser excelente, pero debe divulgar su afiliación con él, como se indica en las preguntas frecuentes .
Matthias Braun
@MatthiasBraun OK, estoy de acuerdo contigo, no lo sabía. Edité la respuesta.
Diego Catalano
1
El Marco de Catalano se trasladó a github.com/DiegoCatalano/Catalano-Framework
HairOfTheDog
4

El mejor enfoque es usar GraphicsMagick Image Processing System con im4java como una interfaz de línea de comando para Java.

GraphicsMagick ofrece muchas ventajas, pero una para todos:

  • GM se utiliza para procesar miles de millones de archivos en los sitios de fotos más grandes del mundo (por ejemplo, Flickr y Etsy).
kajo
fuente
es solo un contenedor de línea de comandos, no una biblioteca ...
Kulpemovitz
3

http://im4java.sourceforge.net/ : si está ejecutando Linux, bifurcar un nuevo proceso no es costoso.

Amanjit Gill
fuente
Pero ten cuidado con los errores de memoria ...
Claes Mogren
bifurcar es caro. Puede usar mucha memoria. Consulte la cita de la persona de un artículo en la parte inferior de coderanch.com/t/419196/java/java/there-any-way-execute-Linux (El artículo es: developers.sun.com/solaris/articles/subprocess/subprocess .html )
Plaudit Design
@Plaudit checkout gm4java, crea un grupo de procesos GM en modo interactivo y no necesita bifurcarse cada vez para convertir una imagen. kennethxu.blogspot.com/2013/04/…
Kenneth Xu
2

Para herramientas comerciales, es posible que desee probar Snowbound.

http://www.snowbound.com/

Mi experiencia con ellos es algo anticuada, pero descubrí que su API de imágenes Java es mucho más fácil de usar que JAI y mucho más rápida.

Su atención al cliente y ejemplos de código también fueron muy buenos.

Clayton
fuente
1

No puedo decir que sea la "mejor" biblioteca, pero creo que puede probar esto: http://algart.net/java/AlgART/ Es una biblioteca Java de código abierto, que admite matrices y matrices "inteligentes" generalizadas con elementos de diferentes tipos (desde punto flotante de 1 bit a 64 bits), incluido el procesamiento de imágenes 2D, 3D y multidimensionales y otros algoritmos, trabajando con matrices y matrices. Desafortunadamente en este momento no consta de suficientes demostraciones y ejemplos, pero, por otro lado, contiene muchos JavaDocs. Se encuentra en la base del software comercial (SIMAGIS) durante varios años, pero ahora es de código abierto.

Daniel
fuente
2
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia.
Matthias
Tienes razón, he editado el primer comentario.
Daniel