2009-05-15 15 views
10

¿Alguien sabe de una libre biblioteca de código jpeg de código abierto para C/C++? Actualmente estoy usando ImageMagick, que es fácil de usar, pero es bastante lento. Lo comparé con una evaluación de Intel Performance Primitives y la velocidad de IPP es una locura. Desafortunadamente también cuesta 200 $, y no necesito el 99% del IPP). Además, solo funcionará rápido en Intel.Biblioteca de codificación Fast JPEG

¿Alguien hace alguna prueba? ¿Hay otras buenas bibliotecas que sean más rápidas que ImageMagick?

Editar: Estaba usando la versión de 8 bits de ImageMagick, que se supone que es más rápido.

+1

¿Qué es exactamente "lento"? ¿Puedes dar números? – lothar

+0

En este momento, no.Todo lo que sé es el uso de% de CPU cuando le pido que codifique un montón de imágenes. Yo diría que IPP es un orden de magnitud más rápido. Pero estoy en el proceso de obtener algunos números reales. – Budric

Respuesta

2

ImageMagick utiliza libjpeg (a.k.una biblioteca independiente de JPEG Group). Si mejora la velocidad de libjpeg, la velocidad de ImageMagick JPEG aumentará.

hay algunas opciones:

  1. compilar un libjpeg optimizado. Si tienes un gcc moderno y al menos un Pentium 4, puedes probar -O3 -msse2 y ver si puede aumentar tu velocidad. Entonces puede usar LD_LIBRARY_PATH o de alguna otra forma para cargar su libjpeg en lugar del sistema.
  2. Pruebe libjpeg-mmx. No se ha mantenido, y supuestamente tiene errores y fallas de seguridad, pero puede darle un impulso de velocidad en su caso.
+2

libjpeg-turbo es muy estable, y es utilizado por la mayoría de los navegadores hoy en día. No te molestes con el IJG libjpeg. –

1

Si mira a su alrededor, puede encontrar una versión anterior de la biblioteca Intel JPEG. No es de código abierto, pero es rápido. Fue lo suficientemente rápido para obtener 25 fps en un P-III de 733MHz.

+1

Desafortunadamente no puedo. Todos se refieren a Intel, que por supuesto ya no lo proporciona. Si tienes un enlace, me gustaría tenerlo. – Budric

3

Creo que GIL, que es una biblioteca en Boost, contiene una forma de guardar los datos de imagen en formato JPEG. No sé la velocidad de eso, sin embargo. Dado que la biblioteca está patrocinada por Adobe, esperaría que esté bastante bien hecha.

+0

Gracias, me perdí esa, aunque uso boost. – Budric

+0

No estoy seguro, pero GIL usa libjpeg para descodificar y codificar JPEG, entonces lo que importa aquí es el rendimiento de libjpeg. – Qubeuc

+0

GIL es una biblioteca genérica de manipulación de imágenes, no implementa ninguna E/S y compresión de forma nativa. En cambio, como mencionó Qubeuc, depende de bibliotecas de terceros. Actualmente, las extensiones GIL IO se han implementado para JPEG utilizando libjpeg y PNG usando libpng. Quizás TIFF (libtiff) también esté disponible, no estoy seguro. – mloskot

3

AMD ofrece Framewave, una alternativa de origen abierto a IPP.

+0

Al mirar brevemente la API, parece que proporcionan los fundamentos JPEG como transformación DCT, pero no veo una función de escritura real que me proporcione una imagen JPEG válida. ¿Lo has usado? ¿Puedes señalarme la función correcta? – Budric

+2

Al igual que IPP, Framewave es una biblioteca de bloques de código "encadenables", no funciones de herramientas completas. Tienes que escribir/leer los datos binarios tú mismo. Dicho esto, hay un código disponible para leer y escribir JPEG con IPP aquí: http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-code-samples Framewave es " Compatible con API "con IPP, por lo que todo lo que se necesita es reemplazar las llamadas IPP con llamadas Framewave. Las llamadas utilizan exactamente el mismo nombre con diferentes prefijos (fwiEncodeHuffman8x8_JPEG_16s1u_C1 vs. ippiEncodeHuffman8x8_JPEG_16s1u_C1). – Tobiesque

1

También está el Independent JPEG Group que es bastante antiguo y no puedo garantizar su velocidad. Pero debería ser estable.

Se encontró a través de this page.

+0

Eso es lo que usamos. Funciona muy bien para lo que lo usamos. –

1

Hice un tiempo de codificación de un 512x512 jpeg con 100% de calidad (sé que el 100% no es sin pérdidas). Básicamente ImageMagick fue solo un poco más lento que libjpeg. Para 100 imágenes, la diferencia fue del orden de décimo de segundo. Luego obtuve libjpeg con extensión SIMD (http://cetus.sakura.ne.jp/softlab/jpeg-x86simd/jpegsimd.html#source) y esa cosa 6-10 veces más rápido. Tenga en cuenta que realmente depende del tipo de imagen. Las imágenes con mucho negro son realmente rápidas, las imágenes con detalles en todas partes son realmente lentas, creo que es el algoritmo de codificación. Puede que tenga que probar libjpeg-mmx porque parece más mantenido que la versión japonesa que obtuve y que ni siquiera sé cuál es la licencia.

También intenté hacer que Framewave funcione y ni siquiera pude levantarlo. A los archivos de cabecera les falta la definición de alguna estructura y los foros no ofrecen absolutamente ningún soporte. No puedo creer que sea "patrocinado por AMD".