如何使用UIImagePNGRepresentation在iOS上压缩图像大小?

12

我正在使用UIImagePNGRepresentation来保存一张图片,结果的图片大小超过了30 KB,在我的情况下这是个很大的文件。

我尝试使用UIImageJPEGRepresentation来压缩图片,它可以让图像保持在小于5KB的大小,这非常好,但是用JPEG保存会给它一个白色背景,而我不想要(我的图片是圆形的,所以我需要保存它的透明背景)。

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


1
简单的答案是你不能,除非你选择牺牲图像尺寸。UIImagePNGRepresentation返回图像最小可能的压缩大小,由于这是一种无损压缩方法,它不会像JPEG那样影响图像质量。因此,唯一的可能性就是减小图像尺寸。 - Ayan Sengupta
2
@AyanSengupta 这并不完全正确,PNG 图像有多种方式可以获得更好的压缩效果(不同的解压设置、使用不同的设置、调色板),但要选择最佳的一种,我们必须尝试它们所有。有专门的工具来优化 PNG 图像,但我们不能期望一个简单的图形编码器能够做到这一点。 - Sulthan
1
如果您的图像颜色不多,可以选择使用PNG-8(带有256种颜色调色板的PNG),这通常更小。强制UIImagePNGRepresentation生成这种格式可能会很困难,因此您可能需要尝试将UIImage转换为RGB数据,然后尝试使用不同的PNG编码器,例如libpng。最终结果取决于您拥有的图像。 - Sulthan
1
@Sulthan,你说得对。但是我认为我们谈论的是一些不同的上下文。用户问我们是否可以使用UIImagePNGRepresentation来减小图像大小,而我们绝对不能使用该API来做到这一点。显然有一些第三方API可用于替代。不幸的是,本地的UIImagePNGRepresentation已经尽力了:( - Ayan Sengupta
谢谢你们提供的信息!我认为需要减小维度以缩小文件大小。目前的维度是118x118,得试一下更小的大小 :| - Hyder
@Sha,你试过我的解决方案了吗?在检查它是否大于5KB后,我正在将其高度/2和宽度/2缩小。 - Shehzad Ali
2个回答

2
PNG使用无损压缩,这就是为什么UIImagePNGRepresentation不像UIImageJPEGRepresentation那样接受compressionQuality参数的原因。您可能会通过不同的工具得到稍微较小的PNG文件,但不会像JPEG那样明显。

0

也许这会对你有所帮助:

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

可以在后台队列中完成吗?(. UIGraphicsBeginImageContext) - gaussblurinc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接