Comprimir UIImage en datos de image JPEG varias veces

Estoy depurando un fragment de código en el que un UIImage puede pasar por UIImageJPEGRrepresentación varias veces, pensé que debe ser un error y que la calidad de la image empeorará, pero sorprendentemente no podemos ver la diferencia visualmente.

Entonces hice una testing, cargué una image e intenté dejarla pasar por UIImageJPEGRepresentation 1000 veces, sorprendentemente, si 1 o 1000 veces realmente no hace una diferencia visual en la calidad de image, ¿por qué es así?

Este es el código de testing:

UIImage *image = [UIImage imageNamed:@"photo.jpeg"]; // Create a data reference here for the for loop later // First JPEG compression here // I would imagine the data here already has low image quality NSData *data = UIImageJPEGRepresentation(image, 0); for(int i=0; i<1000; i++) { // Convert the data with low image quality to UIImage UIImage *image = [UIImage imageWithData:data]; // Compress the image into a low quality data again // at this point i would imagine the image get even more low quality, like u resaved a jpeg twice in phootshop data = UIImageJPEGRepresentation(image, 0); } // up to this point I would imagine the "data" has gone through JPEG compression 1000 times // like you resave a jpeg as a jpeg in photoshop 1000 times, it should look like a piece of crap UIImage *imageFinal = [UIImage imageWithData:data]; UIImageView *view = [[UIImageView alloc] initWithImage:imageFinal]; [self.view addSubview:view]; // but it didn't, the final image looks like it has only gone through the jpeg compression once. 

EDITAR: mi duda se puede resumir en un código más simple, si haces esto en objectiveC:

  UIImage *image1 = an image.. NSData *data1 = UIImageJPEGRepresentation(image1, 0); UIImage *image2 = [UIImage imageWithData:data1]; NSData *data2 = UIImageJPEGRepresentation(image2, 0); UIImage *imageFinal = [UIImage imageWithData:data2]; 

¿ImageFinal pasó por la compression JPEG dos veces?

Como usted sabe, la compression JPG funciona alterando la image para producir un tamaño de file más pequeño. La razón por la que no ve una calidad progresivamente peor es porque está usando la misma configuration de compression cada vez.

El algorithm altera la image de origen lo suficiente como para caber en el perfil de compression; en otras palabras, al comprimir el resultado del 50% JPG nuevamente al 50%, se producirá la misma image, ya que la image ya no necesita ser alterada.

Puedes probar esto en Photoshop: guarda una foto con un JPG de 30% de calidad. Vuelve a abrir el file que acabas de save, y ve a Guardar para Web – voltear entre PNG (sin comprimir / original) y JPG 30% – no habrá diferencia.

Espero que esto ayude.

Todos los types de compression idealmente networkingucirán el tamaño de una image. Hay dos types de compression que describen cómo afectan las imágenes:

Compresión con pérdida: la compression con pérdida networkingucirá el tamaño de la image eliminando algunos datos de la misma. Por lo general, causa la calidad de la image, lo que significa que networkinguce la calidad de la image.

Compresión sin pérdida: la compression sin pérdida networkinguce el tamaño de la image al cambiar la forma en que se almacenan los datos. Por lo tanto, este tipo de compression no cambiará la calidad de la image.

Verifique el tipo de compression que está utilizando.

Esto puede ayudarlo a disminuir el tamaño de la image. pon el número de ti mismo cuántas veces quieres realizar un ciclo;

 UIImage *image = [UIImage imageNamed:@"photo.jpeg"]; for(int i=100; i>0; i--) { UIImage *image = [UIImage imageWithData:data]; NSData *data = UIImageJPEGRepresentation(image, (0.1 * i); NSLog(@"%d",data.length); }