问题 上传图片问题(UIImageJPEGRepresentation vs UIImagePNGRepresentation)


我已经使用Safari的“保持+保存图像”选项将一些图片存储到模拟器中的照片库中。当我从库中选择图像时,我必须将其转换为JPEG或PNG,以便我可以将其上传到服务器。问题是原始图像的大小约为200 KB,但转换为PNG后的图像大约为2 MB。我在用着 UIImagePNGRepresentation 转换 UIImage 反对 NSData 然后发布图像。

  1. 我在这里想念的是什么?为什么图片的大小会比原始大小大?我怎么能阻止这个?

  2. 有什么区别 UIImageJPEGRepresentation 和 UIImagePNGRepresentation?应该使用哪一种(推荐)?

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

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


6715
2018-01-30 10:40


起源



答案:


我猜测原始图像存储为JPEG。

PNG设计用于存储屏幕截图和线条图等内容。它不是为存储照片等内容而设计的。

这一切都归结为所使用的压缩类型,PNG使用无损压缩,因此图像将与原始图像完全相同。 JPEG使用有损压缩,生成的图像是原始图像的近似值。

如果您使用有损JPEG并将其另存为PNG,那么它的大小会增加,通常会大量增加,如您所见。

问题的解决方案是在上传图像之前不对图像执行任何操作。它们已经是PNG,GIF或JPEG图像。这就是你应该上传的内容。

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

听起来你可能需要做一些阅读 PNG 和 JPEG 通常。


10
2018-01-30 11:03



感谢您的答复。我正在使用POST方法上传我的图像,除此之外我不知道除了通过UIImageJPEGRepresentation或UIImagePNGRepresentation方法将UIImage转换为NSData(在post请求中提供“Content-Type:image / jpeg”)。 - Mustafa
如何实现以原始格式上传图像的结果? - Mustafa
我不害怕iPhone开发的问题。但我想你只需要加载文件,将其转换为NSData并上传。如果你甚至需要触摸JPEG / PNG类只是为了上传文件中的数据,我会感到惊讶。对不起,我不能再帮忙了。 - andynormancx
我快速的谷歌搜索表明我可能错了你不需要UIImageJPEGRepresentation forums.macrumors.com/showthread.php?t=558573 - andynormancx
感谢您分享的信息。 - Mustafa


答案:


我猜测原始图像存储为JPEG。

PNG设计用于存储屏幕截图和线条图等内容。它不是为存储照片等内容而设计的。

这一切都归结为所使用的压缩类型,PNG使用无损压缩,因此图像将与原始图像完全相同。 JPEG使用有损压缩,生成的图像是原始图像的近似值。

如果您使用有损JPEG并将其另存为PNG,那么它的大小会增加,通常会大量增加,如您所见。

问题的解决方案是在上传图像之前不对图像执行任何操作。它们已经是PNG,GIF或JPEG图像。这就是你应该上传的内容。

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

听起来你可能需要做一些阅读 PNG 和 JPEG 通常。


10
2018-01-30 11:03



感谢您的答复。我正在使用POST方法上传我的图像,除此之外我不知道除了通过UIImageJPEGRepresentation或UIImagePNGRepresentation方法将UIImage转换为NSData(在post请求中提供“Content-Type:image / jpeg”)。 - Mustafa
如何实现以原始格式上传图像的结果? - Mustafa
我不害怕iPhone开发的问题。但我想你只需要加载文件,将其转换为NSData并上传。如果你甚至需要触摸JPEG / PNG类只是为了上传文件中的数据,我会感到惊讶。对不起,我不能再帮忙了。 - andynormancx
我快速的谷歌搜索表明我可能错了你不需要UIImageJPEGRepresentation forums.macrumors.com/showthread.php?t=558573 - andynormancx
感谢您分享的信息。 - Mustafa


关于第三点,您可以在图像选择器委托方法中确定从库中加载的图像类型,如下所示:

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

}

1
2018-01-03 18:45