2010-06-23 15 views
5

Tengo un archivo bmp y estoy tratando de convertirlo a formato jpeg. El jpeg creado con el siguiente código pierde mucha claridad. He intentado ajustar muchas configuraciones sin ningún resultado.Problema al convertir bmp a jpg usando TJpegImage Componente

¿Alguien tiene una función que convertirá un archivo bmp en un jpeg?

var 
    Bmp: TBitmap; 
    Jpg: TJPEGImage; 
begin 
    Bmp := TBitmap.Create; 
    Jpg := TJPEGImage.Create; 
    try 
    Bmp.LoadFromFile(BmpFileName); 
    Jpg.Assign(Bmp); 
    jpg.PixelFormat :=jf24bit; // or jf8bit 
    Jpg.CompressionQuality := 100; 
    Jpg.ProgressiveDisplay := False; 
    Jpg.ProgressiveEncoding := False; 

    Jpg.SaveToFile(JpgFileName); 
    finally 
    Jpg.Free; 
    Bmp.Free; 
    end; 
end; 

Actualización II Una gran cantidad de personas que han respondido que JPEG no es el tipo de gráfico para usar en este caso. Entendido. No para vencer a un caballo muerto, pero he podido usar otros programas (es decir, Photoshop) y convertir esto en un bonito jpeg. Y la herramienta que estoy usando para crear el gráfico (fusioncharts) también puede exportarlo a un jpeg atractivo (ver abajo). ¿Cuál es la diferencia?

+0

No sé si este es el problema. Es posible que desee establecer la configuración de calidad ANTES de asignar el BMP al Jpg. La conversión puede ocurrir en la asignación y no en guardar en el archivo. –

+0

@gbrandt: No, la declaración está perfectamente bien donde está. –

+1

Hice un poco de seguimiento sobre esto. Por lo que puedo deducir parece perder la claridad durante la llamada a savetofile. En mi proyecto agregué un TImage y le asigno el jpeg. Rinde bien. –

Respuesta

1

Como han dicho otros, JPEG es simplemente el mal formato para ese tipo de imagen - y con los bordes croma de alta frecuencia, que tiene posiblemente una de las imágenes del peor caso para JPEG!

Le recomiendo que obtenga una copia de Paint.Net, intente guardar/previsualizar imágenes en diferentes formatos (PNG, JPEG, GIF, BMP, etc.) y tenga una idea de las diferencias entre tamaño de imagen, calidad y rendimiento .

He intentado guardar su imagen de prueba con Paint.net como JPEG, y obtener exactamente la misma calidad que Delphi, por lo que ahora no está mal con lo que usted (o Delphi) están haciendo ...

ACTUALIZACIÓN: According to Wikipedia...

Hay un modo opcional sin pérdida definido en el estándar JPEG; sin embargo, ese modo no es ampliamente compatible con los productos .

Supongo que FusionCharts y Photoshop tienen una forma de especificar este modo. Normalmente no se usa, porque JPEG generalmente se considera sinónimo de compresión LOSSY.

En resumen, mientras que los archivos JPEG pueden admitir la compresión sin pérdida, JPEG no es un formato ideal porque no es ampliamente compatible. Si quieres sin pérdidas, PNG sigue siendo una mejor opción. La versión comprimida PNG de su imagen es un 30% más pequeña que la JPEG comprimida sin pérdida (71K vs 101K)

+0

Gracias por su respuesta detallada. Entonces la respuesta de la imagen "grande" es no usar jpeg.Pero lo que no puedo entender es cómo algunos programas pueden guardarlo en formato jpeg y aún así se ve bien. He agregado un nuevo archivo jpeg arriba. ¿Cómo puede este jpeg renderizar bien? –

4

Si desea perder la menor calidad posible, debe comprimir lo menos posible, es decir, establecer CompressionQuality := 100.

actualización

El formato de imagen JPG está diseñado para usarse con fotografías y raster imágenes similares. JPG emplea compresión destructiva para reducir el tamaño del archivo. Sin embargo, el efecto visual de esta compresión es despreciable para valores de calidad de gran tamaño (> ~ 80), porque las fotografías no contienen grandes áreas del mismo color, formas muy regulares, etc.

El formato JPG debe nunca se puede utilizar para cualquier cosa que no sean imágenes fotográficas. Por ejemplo, diagramas, capturas de pantalla, etc., que contienen áreas grandes del mismo color exacto, formas muy regulares, etc., mostrarán artefactos claros cuando se comprima JPG. Para este tipo de imágenes ráster, use PNG. PNG también es un formato comprimido (¡un formato muy, muy bueno también!), Pero la compresión no es destructiva.

¡Por favor, no use JPG para su diagrama! ¡Usa PNG!

+0

Cambiar la CompressionQuality no lo afecta (he actualizado el valor en mi publicación original). –

+0

Bien, gracias. La respuesta de "panorama general" parece ser que jpeg no es el tipo de gráfico aplicable. PERO, lea mi Actualización II arriba. Parece que de hecho se puede convertir en un jpeg respetable. ¿Por qué es esto? –

1

Como dijo Andreas, Levantar la CompressionQuality a 100. Si desea probar otro ejemplo, el Dr. Bob (SO frecuente colaborador) tiene una buena valoración crítica aquí:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5031886.html#

Tiene código que usa un enfoque de secuencia. Esperaría el mismo resultado, pero nunca se sabe. Aquí está el código:
https://web.archive.org/web/1/http://techrepublic%2ecom%2ecom/html/tr/sidebars/5031886-1.html

+0

Lo intenté - el mismo resultado. ¿Se puede garantizar que obtenga los mismos resultados con un jpeg que con un bmp? –

+0

@MSchenkel - no, jpeg es un algoritmo con pérdida, y no dará resultados idénticos como BMP. Use GIF o PNG para obtener mejores resultados. Jpeg será satisfactorio para las fotos, pero verá artefactos "mosquito" con capturas de pantalla, texto, dibujos, etc. –

0

No creo que basta con configurar jpg.CompressionQuality solo es suficiente. También debe llamar jpg.Compress() después de comprimir la imagen en realidad ...

Algo así como:

jpg: = TJPEGImage.Create(); jpg.LoadFromFile ('foo.jpg'); jpg.DIBNeeded(); jpg.CompressionQuality: = 25; jpg.Compress(); jpg.SaveToFile ('bar.jpg'); jpg.Free();

HTH, Dejan

2

Yo tenía el mismo problema que tú. Es mi solución.

1) Use la clase TsdJpegGraphic desde the NativeJPG library en lugar de la imagen TJPEG de Delphi. Es gratis y de código abierto.

2) El código:

var 
    Bmp: TBitmap; 
    Jpg: TsdJpegGraphic; 
begin 
    Bmp := TBitmap.Create; 
    Jpg := TsdJpegGraphic.Create; 
    try 
    Bmp.LoadFromFile(BmpFileName); 
    Jpg.CompressionQuality := 100; // !!! 
    Jpg.Assign(Bmp); 
    Jpg.SaveToFile(JpgFileName); 
    finally 
    Jpg.Free; 
    Bmp.Free; 
    end; 
end; 

Es importante establecer la propiedad CompressionQuality antes de asignar el mapa de bits a JPG! Si coloca este comando después de la asignación, la biblioteca usará el valor predeterminado (= 80%) para CompressionQuality.