在iOS上使用ImageIO创建渐进式JPEG会在设备上产生方块状的结果

11

我正在尝试从UIImage对象创建逐渐显示的JPEG,以下是我的代码:

NSMutableData *data = [NSMutableData data];

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent: @"Library/Caches/test.jpg"];

CFURLRef url = CFURLCreateWithString(NULL, (CFStringRef)[NSString stringWithFormat:@"file://%@", path], NULL);
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL);
CFRelease(url);

NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                (__bridge id)kCFBooleanTrue, kCGImagePropertyJFIFIsProgressive,
                                nil];

NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSNumber numberWithFloat:.7], kCGImageDestinationLossyCompressionQuality,
                            jfifProperties, kCGImagePropertyJFIFDictionary,
                            nil];

CGImageDestinationAddImage(destination, ((UIImage*)object).CGImage, (__bridge CFDictionaryRef)properties);
CGImageDestinationFinalize(destination);
CFRelease(destination);

在模拟器中运行得很好,但是在设备上产生了断块/方块状的结果:

chunky/blocky result.

有什么想法吗?如果万不得已,我会回退到使用UIImageJPEGRepresentation,但我真的需要渐进式JPEG。


@ShivanRaptor 这个已经在 iOS 5.0 - 5.1.1 上进行了测试。 - Jorge Cohen
我正在尝试使用我的手机测试代码。你能分享一下你正在使用的 test.jpg 吗? - Raptor
@ShivanRaptor 我已经没有那张图片了,基本上我使用过的每张图片都会出现这种情况。 - Jorge Cohen
你正在运行模拟器的哪个硬件设备?如果您在错误的硬件设备上运行它,有时会发生这种情况,如果您没有提供标准图像和高分辨率图像(Retina为每个图像提供带有@2x的额外版本,在每个图像名称之前但在扩展名之前),则可以通过转到屏幕顶部的IOS模拟器工具栏并选择硬件>>设备>>(此处要运行的设备)来更改模拟器的设备硬件。 - Popeye
Hezi,如果您能接受我的答案,那就太好了,因为代码在设备本身上确实可以工作。其他人一直在寻找这个问题的答案,如果得到解答,将会对他们有所帮助。如果您也想自己回答,那也没关系——复制并粘贴我的答案——但请关闭这个已经得到答案的问题。谢谢! - David H
显示剩余2条评论
2个回答

0
好消息:我刚在iPhone 4上测试过,图片效果很棒:
NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys:
@72, kCGImagePropertyJFIFXDensity,
@72, kCGImagePropertyJFIFYDensity,
@1, kCGImagePropertyJFIFDensityUnit,
nil];

(使用新的文字语法)。

这里有一个很好的JFIF参考,可以说明这些密度选项的含义。


0

在iOS模拟器上,就像你所提到的那样,一切都很好。

但是你有没有在带Retina显示屏的iOS模拟器上进行测试呢?如果是,请按照以下步骤操作: 1. 启动模拟器 2. 转到“硬件”-->“设备” 3. 选择一个带有Retina显示屏的模拟器并再次检查。

如果你在iOS Retina模拟器上遇到了问题,那么你就找到了问题所在。

尝试使用非常小分辨率的图像,然后在你的设备上进行测试。

UIImageView中显示非常高分辨率的图像存在一些问题。 请检查下面提到的链接: High Resolution Image in UIImageView


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