使用UIImageJPEGRepresentation时,compressionQuality应该是多少?

24

我想对来自用户库的照片应用滤镜,然后将其写回磁盘。我正在使用UIImageJPEGRepresentation。该函数需要一个UIImage和0.0到1.0之间的compressionQuality值。因为我想保留原始质量,所以将其设置为1.0。但是我发现这实际上创建了一个文件大小比原始文件更大的图像文件,甚至有些显着更大。我注意到在苹果的示例照片编辑扩展应用程序中,他们总是将质量设置为0.9。我尝试了一下,它确实输出了一个接近原始照片文件大小的文件大小。这对我来说没有意义。有人能解释一下吗?是否适合始终使用0.9?iOS相机是否使用该值进行压缩,因此0.9是原始质量?如果没有任何更好的质量,为什么0.9实际上不是1.0呢?

NSData *renderedJPEGData = UIImageJPEGRepresentation(image, 0.9f);

2
0.9会导致图像质量损失 - 这意味着应用了某种程度的压缩,因此您将丢失数据。如果需要保留原始质量,请使用UIImagePNGRepresentation。JPG是一种有损格式。使用PNG将导致文件大小更大,但保存的结果将与输入图像的质量相同。 - rickerbh
@rickerbh 但是使用iPhone相机拍摄的照片输出格式为JPEG而不是PNG。 - Jordan H
3
好的。但是如果你想保留同样的质量,就不应该使用有损格式重新编码图像。如果你可以接受一些质量上的损失(通常人们看图片时都不太会注意到),可以使用JPG格式。我通常会选择类似于0.7这样的值,因为我发现这通常可以得到一张不太糟糕的图片,并且能够节省文件大小。如果你想了解更多关于重新压缩图像的信息,请查看http://www.ampsoft.net/webdesign-l/jpeg-compression.html中的“Recompression”部分。 - rickerbh
我想在这里再补充一点。我保存了从UIImageJPEGRepresentation()返回的NSData并将其保存到文档目录中,还从此数据创建了UIImage对象并将其保存到照片库中。两者具有相同的图像数据,但生成的图像大小不同(大小差异> 50 Kb)。同时我没有为它提供扩展名。无法弄清楚发生了什么。可能是在保存图像到照片库时会提供一些质量扩展或类似的东西。 - Kampai
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jordan H
@Joey 这似乎是一个不同的问题。你应该发布一个新的问题并发布相关的代码,包括如何生成文件系统 URL。 - rickerbh
3个回答

2
这是一个老问题,你可能已经自己解决了,但如果还有人感兴趣,这可能会有所帮助。(我不是JPEG专家)UIImageJPEGRepresentation没有考虑到图片以前可能已经被压缩过,它只是压缩当前的图片。你提到一个来自“用户库”的照片,用户可以在他们的库中拥有任何图像,并进行任何压缩质量的压缩。为了保持图像与同一文件大小相同,您需要知道它最初是如何保存的,即使使用相同的压缩质量,由于被压缩的数据不同,您也可能会得到不同的文件大小。至于是否使用压缩质量0.9来保存图像,则取决于您对图像质量和所需空间的重视程度。0.7似乎是一个很好的平衡点。我不确定iOS相机应用程序压缩图像的程度(如果有),也不确定它是否保证具有最佳可能的质量。如果它使用0.9,那么您可以创建一个应用程序,在保存之前拍摄照片并进行更少的压缩。希望这有所帮助。

0

顺便说一下,我使用AsJPEG()将相同的600x800图像转换为以下压缩比以查看大小并衡量其可见质量损失:
1.0:642KB
0.9:212KB
0.7:144KB
0.5:86KB

即使是0.5,可见质量也没有受到太大影响! 我将在网页上使用这些图像,因为视觉完美并不是最重要的,所以我将使用0.5来获得小文件大小的好处(13%)。 当然,你的情况可能会有所不同 :)


-5
您可以将图像转换为PNG格式,以获得原始图像质量。
UIImagePNGRepresentation(image)

2
我不想使用UIImagePNGRepresentation,而是想使用UIImageJPEGRepresentation :) - Ananta Prasad

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