使用CGImageSource / CGImageDestination在磁盘上旋转CGImage?

时间:2011-05-23 16:58:42

标签: objective-c cocoa-touch uiimage uiimagepickercontroller javax.imageio

我正在开发一个需要使用UIImagePickerController拍照的应用程序,在应用程序中显示它的缩略图,并使用ASIFormDataRequest将该图片提交给服务器(来自{{ 1}})。

我想使用来自ASIFormDataRequest的ASIHTTPRequest,因为根据我的经验,它比使用setFile:withFileName:andContentType:forKey:提交图像并提交原始NSData更快。为此,我正在使用CGImageDestination并使用url创建图像目标,将该图像保存到磁盘,然后将该文件上载到磁盘上。

为了创建缩略图我正在使用UIImageJPEGRepresentation(请参阅docs)并使用我刚保存的文件的路径创建图像源。

我的问题是,无论我将哪些选项传递到图像目的地或缩略图创建调用,我的缩略图总是逆时针旋转90度。上传的图像也会旋转。我尝试使用CGImageSourceCreateThumbnailAtIndex明确设置图像选项中的方向,但似乎没有。我发现的唯一解决方案是在内存中旋转图像,但我真的想避免这种情况,因为这样做可以缩短缩略图+保存操作完成所需的时间。理想情况下,我希望能够在磁盘上旋转图像。

我错过了使用CGImageDestinationSetPropertiesCGImageDestination的方法吗?我将在下面发布一些代码。

保存图片:

CGImageSource

生成缩略图

NSURL *filePath = [NSURL fileURLWithPath:self.imagePath];
CGImageRef imageRef = [self.image CGImage];
CGImageDestinationRef ref = CGImageDestinationCreateWithURL((CFURLRef)filePath, kUTTypeJPEG, 1, NULL);
CGImageDestinationAddImage(ref, imageRef, NULL);

NSDictionary *props = [[NSDictionary dictionaryWithObjectsAndKeys:
                        [NSNumber numberWithFloat:1.0], kCGImageDestinationLossyCompressionQuality,
                        nil] retain];
//Note that setting kCGImagePropertyOrientation didn't work here for me

CGImageDestinationSetProperties(ref, (CFDictionaryRef) props);

CGImageDestinationFinalize(ref);
CFRelease(ref);

然后上传我刚刚使用的图片

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)filePath, NULL);
if (!imageSource)
    return;

CFDictionaryRef options = (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:
                                            (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
                                            (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
                                            (id)[NSNumber numberWithFloat:THUMBNAIL_SIDE_LENGTH], (id)kCGImageSourceThumbnailMaxPixelSize, nil];
CGImageRef imgRef = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options);
UIImage *thumb = [UIImage imageWithCGImage:imgRef];

CGImageRelease(imgRef);
CFRelease(imageSource);

其中[request setFile:path withFileName:fileName andContentType:contentType forKey:@"photo"]; 是使用上述代码保存的文件的路径。

1 个答案:

答案 0 :(得分:0)

据我所知,在尝试了很多不同的事情后,目前的公共API无法做到这一点,必须在内存中完成。