tiene son que pierde para mejor las jpg imprimir imagen fotos formatos formato entre diferencias calidad ios image macos jpeg cgimage

ios - son - Calidad de compresión JPEG utilizando CGImage



que formato de imagen tiene mejor calidad para imprimir (2)

Estoy usando las API de CGImage ( CGImageDestination, CGBitmapContext, CGImageDestination, CGBitmapContext, etc.) en Mac OS X, así como iOS para comprimir las imágenes a JPEG. Con la propiedad kCGImageDestinationLossyCompressionQuality puede controlar la calidad de compresión: 0.0 es la compresión máxima y 1.0 la calidad máxima (sin pérdida, si es posible, según Apple).

Descubrí que hay un gran salto tanto en el tamaño del disco como en la calidad de la imagen cuando pasas de 0.99 a 1.0. Por ejemplo, tengo una imagen de 2048x1368 que se comprime a 430 KB cuando la calidad se establece en 0.99 pero aumenta a 2.3 MB cuando la calidad se establece en 1.0. También hay un gran salto en la calidad visual y la configuración de 0.99 no es aceptable para esta imagen en particular. Intentar establecer la calidad entre 0.99 y 1.0 no funciona, ya que el tamaño se mantiene en 430 KB hasta 0.995 donde aumenta hasta los 2.3 MB. Además, realmente no hay mucha diferencia entre las calidades de 0.90 a 0.99 que varía en tamaño de archivo de ~ 353 KB a 430 KB, pero no hay mucha mejora en la calidad visual.

¿Alguien sabe si hay alguna manera de aumentar la calidad JPEG? Realmente necesito algo mejor de lo que me da 0.99 pero menos de lo que ofrece 1.0 . Tal vez hay alguna otra API que podría usar?

Puedo intentar usar libjpeg directamente pero espero que no llegue a eso.

Actualizar

Después de algunas investigaciones, resulta que para todos los ajustes de kCGImageDestinationLossyCompressionQuality hasta 1.0 Apple usa submuestreo de croma 4: 2: 0 (o decimación de croma). Esto significa que para la imagen YCrCb solo muestrean un píxel de croma (CrCb) por cada 4 píxeles de luminancia (Y). En otras palabras, solo están utilizando 1/4 de los datos de croma de la imagen original. Para una calidad de 1.0 Apple utiliza el submuestreo de croma 4: 4: 4 , que no es un submuestreo de croma o un píxel de croma por cada píxel de luminancia. Esta es la razón por la que el tamaño del archivo explota, ya que la imagen contiene 4 veces los datos de color en comparación con las calidades <= 0.99 .

Entonces, ¿alguien sabe si hay una manera de desactivar el submuestreo de croma utilizando CGImage (o cualquier otra API) para calidades inferiores a 1.0 ?


Tal vez hay alguna otra API que podría usar?

WebP es un nuevo formato de imagen de Google que le brinda una mejor compresión que jpg y png, tanto sin pérdidas como sin pérdidas. Hay un proyecto en github que es bastante fácil de usar: https://github.com/seanooi/iOS-WebP

Simplemente agregue una categoría y el marco WebP a su proyecto para usarlo.

//Converting To WebP // quality value is [0, 100] NSData *webpData = [UIImage imageToWebP:[UIImage imageNamed:@"image.jpg"] quality:75]; //Converting From WebP UIImage *webPImage = [UIImage imageFromWebP:@"/path/to/file"]; //Setting image transparency //alpha value is [0, 1] UIImage *transparencyImage = [[UIImage imageNamed:image.jpg] imageByApplyingAlpha:0.5];

El alfa no funciona correctamente, pero como está utilizando jpg, asumo que no lo necesita.


Actualización final

Después de una extensa investigación y siguiendo las sugerencias en los comentarios anteriores, parece que no hay forma de desactivar el submuestreo / diezmado de croma con ninguna de las API integradas de Apple, kCGImageDestinationLossyCompressionQuality de configurar kCGImageDestinationLossyCompressionQuality en 1.0 que da como resultado imágenes muy grandes.

Si necesita poder controlar el submuestreo / decimación de chroma usted mismo al guardar en JPEG, deberá utilizar una biblioteca de terceros como libjpeg.