上传图像问题(UIImageJPEGRepresentation vs UIImagePNGRepresentation)

11

我使用Safari的“长按+保存图片”选项将一些图片存储到模拟器中的照片库中。当我从库中选择一张图片时,我必须将它转换为JPEG或PNG格式,以便上传到服务器。问题在于原始图像的大小约为200 KB,但转换为PNG格式后大小约为2 MB。我正在使用 UIImagePNGRepresentationUIImage 对象转换为 NSData,然后上传该图片。

  1. 我漏掉了什么?为什么图片的大小会变得比原始大小还大?如何防止这种情况?

  2. UIImageJPEGRepresentationUIImagePNGRepresentation 有什么区别?哪个应该被使用(推荐)?

  3. 我能够确定从照片库加载的图像类型吗?

  4. iPhone相机拍摄的图像默认是什么类型?

2个回答

10

我猜原始图像以JPEG格式存储。

PNG是设计用于存储屏幕截图和线条绘制等内容,不适合存储照片等内容。

这完全取决于所使用的压缩类型,PNG使用无损压缩,因此图像将与原始图像完全相同。JPEG使用有损压缩,生成的图像是原始图像的近似值。

如果您将有损JPEG另存为PNG,则其大小会增加,通常会增加很多,正如您所见。

解决问题的方法是在上传之前不对图像进行任何更改。它们已经是PNG、GIF或JPEG图像。这就是您应该上传的。

iPhone相机保存的图像格式为JPEG。

看起来你可能需要阅读一些关于PNGJPEG的文章。


1
感谢您的回复。我正在使用POST方法上传我的图像,除了通过UIImageJPEGRepresentation或UIImagePNGRepresentation方法将UIImage转换为NSData(在post请求中提供“Content-Type:image / jpeg”)之外,我不知道其他任何方法。 - Mustafa
1
我该如何实现上传图像并保持其原始格式的结果? - Mustafa
很抱歉,我对iPhone开发并不熟悉。但我想你只需要加载文件,将其转换为NSData并上传即可。 我会很惊讶如果你甚至需要去接触JPEG/PNG类来上传文件数据。很遗憾我无法提供更多的帮助。 - andynormancx
快速搜索结果表明,我可能错了,关于你不需要UIImageJPEGRepresentation的想法。http://forums.macrumors.com/showthread.php?t=558573 - andynormancx

1
关于您的第三点,您可以在图像选择器委托方法中确定从库加载的图像类型,如下所示:
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info {

    // Get the image reference URL
    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    // The path extension contains the image type: JPG, PNG, GIF, etc.
    NSString *originalImageType = referenceURL.pathExtension; 

}

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