7

我使用UIImagePNGRepresentation保存图像。结果图像大小为30+ KB,在我的情况下这是大的。如何使用UIImagePNGRepresentation压缩图像大小 - iOS?

我试过使用UIImageJPEGRepresentation,它允许压缩图像,所以图像保存在< 5KB大小,这是伟大的,但它保存在JPEG中给它白色背景,我不想(我的图像是圆形的,所以我需要用透明背景保存它)。

如何使用UIImagePNGRepresentation来压缩图像大小?

+1

答案很简单,你不能,除非你选择妥协图像尺寸。 'UIImagePNGRepresentation'返回图像最小可能的压缩大小,因为这是一种无损压缩方法,与JPEG不同,它不会损害图像的质量。所以唯一可能的是减少图像尺寸。 –

+1

@AyanSengupta事实并非如此,PNG图像有多种方式可以获得更好的压缩效果(不同的膨胀设置,不同的设置,调色板),但要选择最好的压缩方式,我们必须全部尝试。有特殊的工具来优化PNG图像,但我们不能期望一个简单的图形编码器来做到这一点。 – Sulthan

+1

如果你的图像没有很多颜色,你可以使用PNG-8(带有256色调的PNG),它通常比较小。要强制UIImagePNGRepresentation生成这种格式可能很困难,因此您可能想尝试将'UIImage'转换为rgb数据,然后尝试使用不同的PNG编码器,例如, libpng的。最后,这一切都取决于你的形象。 – Sulthan

回答

2

PNG使用无损压缩,这就是为什么UIImagePNGRepresentation不接受compressionQuality参数,如UIImageJPEGRepresentation。你可能会用不同的工具得到一个更小的PNG文件,但没有像JPEG一样。

1

可能,这将帮助你:

- (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 
    } 
} 

调整图像大小

- (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

是否可以在后台队列中完成?(.UIGraphicsBeginImageContext) – gaussblurinc