7

Sto usando UIImagePNGRepresentation per salvare un'immagine. L'immagine del risultato è di dimensioni 30+ KB e questo è GRANDE nel mio caso.Come comprimere le dimensioni dell'immagine usando UIImagePNGRepresentation - iOS?

Ho provato ad utilizzare UIImageJPEGRepresentation e permette di comprimere l'immagine, in modo da immagine salva in formato < 5 KB, che è grande, ma salvandolo in formato JPEG dà lo sfondo bianco, che non voglio (la mia immagine è circolare, così Ho bisogno di salvarlo con uno sfondo trasparente).

Come posso comprimere le dimensioni dell'immagine, utilizzando UIImagePNGRepresentation?

+1

La semplice risposta è che non è possibile, fino a quando si sceglie di compromettere la vostra dimensione dell'immagine. 'UIImagePNGRepresentation' restituisce la dimensione compressa minima possibile per l'immagine e, trattandosi di un metodo di compressione senza perdita, non può compromettere la qualità dell'immagine, a differenza di JPEG. Quindi, solo la possibilità è di ridurre la dimensione dell'immagine. –

+1

@AyanSengupta Non è proprio vero, ci sono molti modi in cui un'immagine PNG può ottenere una compressione migliore (diverse impostazioni di gonfiatura, diverse impostazioni utilizzate, una tavolozza) ma per scegliere la migliore, dovremmo provarli tutti. Esistono strumenti speciali per ottimizzare le immagini PNG, ma non possiamo aspettarci un semplice codificatore grafico per farlo. – Sulthan

+1

Se l'immagine non ha molti colori, si può andare con PNG-8 (PNG con una tavolozza di colori 256) che di solito è più piccola. Potrebbe essere difficile forzare UIImagePNGRepresentation a produrre tale formato, quindi potresti provare a convertire 'UIImage' in dati rgb e quindi provare un codificatore PNG diverso, ad es. libpng. Alla fine tutto dipende dall'immagine che hai. – Sulthan

risposta

2

PNG utilizza la compressione senza perdita di dati, ecco perché UIImagePNGRepresentation non accetta il parametro compressionQuality come fa UIImageJPEGRepresentation. Si potrebbe ottenere un file PNG un po 'più piccolo con strumenti diversi, ma niente come con JPEG.

1

Può essere questo vi aiuterà fuori:

- (void)resizeImage:(UIImage*)image{ 

    NSData *finalData = nil; 
    NSData *unscaledData = UIImagePNGRepresentation(image); 

    if (unscaledData.length > 5000.0f) { 


     //if image size is greater than 5KB dividing its height and width maintaining proportions 


     UIImage *scaledImage = [self imageWithImage:image andWidth:image.size.width/2 andHeight:image.size.height/2]; 
     finalData = UIImagePNGRepresentation(scaledImage); 

     if (finalData.length > 5000.0f) { 

      [self resizeImage:scaledImage]; 
     } 
     //scaled image will be your final image 
    } 
} 

ridimensionamento delle immagini

- (UIImage*)imageWithImage:(UIImage*)image andWidth:(CGFloat)width andHeight:(CGFloat)height 
{ 
    UIGraphicsBeginImageContext(CGSizeMake(width, height)); 
    [image drawInRect:CGRectMake(0,0,width,height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext() ; 
    return newImage; 
} 
+0

potrebbe essere fatto in coda in background? (. UIGraphicsBeginImageContext) – gaussblurinc