我应该何时使用UIImageJPEGRepresentation和UIImagePNGRepresentation将不同的图像格式上传到服务器?

Ole*_*rov 23 cocoa-touch objective-c uikit uiimage ios

在我的应用程序中,我必须将不同格式的图像发送到服务器(它必须是UIImage该类可以读取的所有文件格式)https://developer.apple.com/library/ios/#documentation/uikit/reference/ UIImage_Class /参考/的reference.html

问题是:我不知道何时应该使用这些方法.当然,很明显,对于.png图像我需要使用UIImagePNGRepresentation.jpg/.jpeg UIImageJPEGRepresentation.但对于其他格式(.tiff,.gif,等)?图像处理只有两种方法,格式也很多.

Rob*_*Rob 50

你说:

当然,对于我需要使用的.png图像UIImagePNGRepresentation以及.jpg/.jpeg 来说很明显UIImageJPEGRepresentation.

不,情况不一定如此.如果你有一些独创的"数字资产",而不是创建一个UIImage,然后利用这两个功能之一创建NSData,你会上传,你会常常只是加载NSData从原来的资产和绕过往返于UIImage在所有.如果这样做,您不会冒任何转换为​​a UIImage,然后再返回的数据丢失的风险.

但是还有一些额外的考虑因素:

  1. 元数据:

    这些UIImageXXXRepresentation函数剥离其元数据的图像.有时候这是一件好事(例如,你不想上传你孩子的照片或昂贵的小工具,包括GPS位置,在那里不满的人可以识别拍摄的位置).在其他情况下,您不希望丢弃元数据(例如,原始镜头的日期,相机等).

    您应该明确决定是否要删除元数据.如果没有,请不要通过a往返您的图像UIImage,而是使用原始资产.

  2. 图像质量损失和/或文件大小注意事项:

    我特别不高兴,UIImageJPEGRepresentation因为它有点压缩.因此,如果使用compressionQuality小于1.0 的值,则可能会丢失一些图像质量(对于接近1.0的值,适度的质量损失,具有较低compressionQuality值的更显着的质量损失).如果你使用compressionQuality1.0,你可以减少大部分JPEG图像质量损失,但结果NSData通常会比原始资产更大(至少如果原始版本是压缩的JPEG或PNG),导致上传速度变慢.

    UIImagePNGRepresentation 不会引入基于压缩的数据丢失,但根据图像,您仍可能丢失数据(例如,如果原始文件是48位TIFF或使用sRGB以外的颜色空间).

    这是一个问题,您在上传过程中是否可以使用某些图像质量丢失和/或更大的文件大小.

  3. 图片尺寸:

    有时您不想上传全分辨率图像.例如,您可能正在使用希望每面不超过800px的图像的Web服务.或者,如果您正在上传缩略图,他们可能想要更小的东西(例如32px x 32px).通过调整图像大小,您可以使上传更小,从而更快(尽管质量明显下降).但是如果使用图像大小调整算法,则使用这些UIImageXXXRepresentation函数创建PNG或JPEG 将非常常见.

简而言之,如果我试图最小化数据/质量损失,我会上传原始资产,如果它是服务器接受的格式,并且我使用UIImagePNGRepresentation(或UIImageJPGRepresentation质量设置为1.0)如果原始资产是不是服务器接受的格式.但是,使用这些UIImageXXXRepresentation功能的选择是您的业务需求和服务器接受的问题.

  • @JeremyHicks这取决于原始资产是什么.如果是`imageWithContentsOfFile`,则返回该文件.如果它是`imageWithContentsOfURL`,你应该从那个URL获取它(或者更准确地说,从前面的那个URL获取`NSData`,然后使用`imageWithData`来制作`UIImage`,但是请回到原来的`NSData `获得原始资产).如果它来自`ALAssetsLibrary`,则使用`assetForURL`来获取`ALAsset`,然后使用`getBytes`来检索与原始资产相关的数据.这一切都取决于你如何获得原始资产. (4认同)
  • 有什么方法可以将原始资产转换为NSData等价物而不使用其中任何一种方法? (3认同)