【发布时间】:2014-12-07 10:58:37
【问题描述】:
我想对用户库中的照片应用过滤器,然后将其写回磁盘。我正在使用UIImageJPEGRepresentation。此函数采用介于 0.0 和 1.0 之间的 UIImage 和 compressionQuality 值。因为想保留原画质,所以设置为1.0。但我发现这实际上创建了一个文件大小比原始文件更大的图像文件,甚至更大一些。我注意到在 Apple 的 Sample Photo Editing Extension 应用程序中,他们总是将质量设置为 0.9。我试过了,它确实输出了接近原始照片文件大小的文件大小。这对我来说没有意义。有人可以解释一下吗?始终使用 0.9 是否合适? iOS 相机是否使用该值对其进行压缩,因此 0.9 是原始质量?或者,如果没有什么比这更好的质量,为什么 0.9 实际上不是 1.0?
NSData *renderedJPEGData = UIImageJPEGRepresentation(image, 0.9f);
【问题讨论】:
-
0.9 将导致图像质量下降 - 应用了一定程度的压缩,因此您将丢失数据。如果您需要保留原始质量,请使用 UIImagePNGRepresentation。 JPG 是一种有损格式。使用 PNG 会导致文件变大,但保存的结果将与输入图像的质量相同。
-
@rickerbh 但是用 iPhone 相机拍摄的照片输出为 JPEG 而不是 PNG
-
当然。但是,如果您想保持相同的质量,则不应使用有损格式重新编码图像。如果您对某些质量损失感到满意(人们查看图像通常不会注意到),请使用 JPG。我通常使用像 0.7 这样的值,因为我发现它通常会产生一个不可怕的图像,但通常可以很好地节省文件大小。如果您想了解更多关于重新压缩的信息,请查看ampsoft.net/webdesign-l/jpeg-compression.html的“重新压缩”部分
-
我想在这里再补充一点。我确实保存了
NSData从UIImageJPEGRepresentation()返回并将其保存到文档目录,还从该数据创建UIImageobject 并将其保存到照片库。两者具有相同的图像数据,但生成的图像具有不同的大小(大小差异 > 50 Kb)。我也没有为此提供扩展名。无法弄清楚会发生什么。可能在将图像保存在照片库中时,它会提供一些质量扩展或类似功能。 -
@rickerbh 抱歉,我才刚刚开始讨论这个问题。使用
UIImagePNGRepresentation会导致错误:Error Domain=NSCocoaErrorDomain Code=-1 "The operation couldn’t be completed. (Cocoa error -1.这是我将其写入磁盘的方式:pngData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)知道发生了什么吗?
标签: ios uiimage uiimagejpegrepresentation