将 UIImage 转换为 PFFile 会产生巨大的文件

Converting UIImage to PFFile results in huge file

我想将图像上传到解析服务器。 PFFile 最多只能是 10mb,所以我写了一个类别来检查 UIImage 字节大小是否不超过那个。

这是我的类别中的代码:

- (UIImage *)scaleImageToSize:(CGFloat)destSize{
    UIImage *img = self;
    NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
    NSLog(@"size: %lu", (unsigned long)[imgData length]);
    while ([imgData length] > destSize) {
        UIImageJPEGRepresentation(img, 0.9);
        NSLog(@"new size: %lu",(unsigned long)[imgData length]);
    }

    return img;
}

然而当我调用[image scaleImageToSize:10485760];。大多数时候都比那个小。

但是,在 运行 下面一行之后:

photoFile = [PFFile fileWithData:UIImagePNGRepresentation(image)];

[photoFile fileSize] 突然超过 10485760。这怎么可能?如何防止照片变成 PFFile 后变得太大?

除了为您提供一些关于 jpeg 大小的信息外,您的 scaleImageToSize 没有任何意义。如果你想存储图像并且它小于 10MB 为 jpeg,那么将它存储为 jpeg 而不是 png。

所以试试这个

photoFile = [PFFile fileWithData: UIImageJPEGRepresentation(image, 1.0)];

我猜这就是您真正想要的

photoFile = [PFFile fileWithData:[self scaleImageToSize(10485760)]];

- (NSData *)scaleImageToSize:(CGFloat)destSize
{
    UIImage *img = self;
    CGFloat compress = 1.0;
    NSData *imgData = UIImageJPEGRepresentation(img, compress);
    NSLog(@"size: %lu", (unsigned long)[imgData length]);
    while ([imgData length] > destSize) {
        compress -= .05;
        imgData = UIImageJPEGRepresentation(img, compress);
        NSLog(@"new size: %lu",(unsigned long)[imgData length]);
    }

    return imgData;
}

这可能会很慢,因此您可能希望在主线程之外的一个块中执行此操作。