2012-01-02 13 views
5

Tengo un código para recrear una imagen de alta calidad con muy mala calidad, pero estoy un poco confundido por los resultados que estoy viendo. El código está aquí:¿Cómo recreo un UIImage a una compresión más baja en iOS?

NSData *compressedData = UIImageJPEGRepresentation(bigImage,0); 
NSLog(@"compressedData length = %d", [compressedData length]); 
self.currentImage = [UIImage imageWithData:compressedData]; 
NSData *dataAfterCompression = UIImageJPEGRepresentation(self.currentImage,1); 
NSLog(@"dataAfterCompression length = %d", [dataAfterCompression length]); 

que da salida:

2012-01-02 02:47:05.615 MyApp[349:707] compressedData length = 32671 
2012-01-02 02:47:06.143 MyApp[349:707] dataAfterCompression length = 251144 

¿Por qué crear una nueva imagen con los datos de baja calidad dan como resultado una imagen tan grande?

Respuesta

-1

sentimos a mis palabras, pero son poco confundido aquí

Aquí está de paso 0.0 significa que la compresión máxima y una menor calidad

NSData * CompressedData = UIImageJPEGRepresentation (bigImage, 0);

NSLog (@ "compressedData length =% d", [compressedData length]);

self.currentImage = [UIImage imageWithData: compressedData];

* Aquí está de paso 1 significa la compresión máxima y una menor calidad *

NSData * dataAfterCompression = UIImageJPEGRepresentation (self.currentImage, 1);

NSLog (@ "dataAfterCompression length =% d", [dataAfterCompression length]);

/* NSData * UIImageJPEGRepresentation ( UIImage * imagen, CGFloat compressionQuality ); */

0,0 significa compresión máxima y una menor calidad

1 significa compresión mínima y de alta calidad

+0

Bueno, estoy usando la más alta calidad la segunda vez para obtener el objeto NSData para el registro de tamaño. Pero la imagen con la que estoy usando la escala de más alta calidad ya debería ser escalada a la calidad más baja, así que creo que debería obtener una imagen de 32.6 KB – Tony

+0

Si desea obtener una imagen con un tamaño de 32 KB aprox. entonces debe usar la compresión máxima en lugar de una compresión más baja. Depende de usted. Deba la vista de este enlace, espero que pueda serle útil http://ofcodeandmen.poltras.com/2008/10/ 30/no-documentado-uiimage-resizing/ – Kamarshad

+0

Lo hice. Lea mi pregunta nuevamente con cuidado – Tony

8

La entrada a UIImageJPEGRepresentation es una matriz 2-D de píxeles, no los datos comprimidos a partir de que esa matriz 2-D fue creada. (¡Es posible que la matriz no provenga de datos comprimidos!) UIImageJPEGRepresentation no sabe nada de dónde vino la imagen, y no tiene ningún concepto de la "calidad" de su entrada. Simplemente sabe que usted quiere que intente muy duro para hacer que la salida sea pequeña (cuando compressionQuality es cero) o si quiere que intente con fuerza para que la salida sea precisa (cuando compressionQuality es uno).

El algoritmo de compresión JPEG tiene algunos parámetros ajustables. El valor compressionQuality selecciona un conjunto de esos parámetros. Cuando establece compressionQuality en 1, el compresor usa un conjunto de parámetros que permiten una muy pequeña pérdida de precisión de los datos de entrada, independientemente de cuáles sean los datos de entrada. Para cualquier datos de entrada, esos parámetros resultan en muy poca pérdida de precisión. La compensación es que esos parámetros también resultan en muy poca compresión. El compresor no piensa "Hmm, debería intentar usar otros parámetros y ver si obtengo la misma precisión con una mejor compresión". Si eso es lo que quieres, tienes que hacerlo tú mismo.

+0

La entrada a UIImageJPEGRepresentation es un UIImage, no una matriz 2D de píxeles. Mi pregunta realmente es cómo construir un UIImage con 32671 bytes de datos podría resultar en un UIImage del tamaño de 251144 bytes. Supongo que es porque al crear el UIImage se descomprimen los datos y se expanden para completar todo el UIImage (aunque creo que necesitaría un frane para hacerlo) y también que la compresión de los datos de la imagen realmente no ahorra mucho espacio. Estaba buscando una descripción más técnica de por qué esto está sucediendo. – Tony

+0

JPEG es un algoritmo para comprimir matrices de píxeles en 2-D. Entonces, cuando llamas a 'UIImageJPEGRepresentation', le pregunta a' UIImage' por su matriz de pixeles 2-D, y opera sobre eso. –

+0

Tal vez mi pregunta es confusa, pero esto realmente no responde mi pregunta en absoluto. Obviamente, ese método va a pedir los datos de píxeles. Esa no es la entrada al método, pero seguro, para comprimir datos de imagen, pedirá los datos :) – Tony

1

No estoy seguro de si esto es exactamente lo que estás buscando, pero este blog tiene algunas clases que extienden UIImage y se trata de la compresión bastante agradable. Echa un vistazo a este sitio web: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

+0

¿Cómo se maneja la compresión "bastante bien"? Lo siento, solo veo el código de cambio de tamaño de la imagen allí – Tony

+0

En las clases tituladas UIImage + NSCoding, hay algún código que trata sobre el formato y la calidad de la codificación, aunque creo que podría ayudar a apuntar en la dirección correcta sobre la compresión, pero tal vez estoy malinterpretando el problema – tams

Cuestiones relacionadas