我正在开发一个应用程序,该应用程序需要使用 拍照UIImagePickerController
,在应用程序中显示它的缩略图,并使用ASIFormDataRequest
(from ASIHTTPRequest
) 将该图片提交到服务器。
我想setFile:withFileName:andContentType:forKey:
从 ASIFormDataRequest 使用,因为根据我的经验,它比尝试使用UIImageJPEGRepresentation
和提交原始 NSData 提交图像要快。为此,我正在使用CGImageDestination
并创建一个带有 url 的图像目标,将该图像保存到磁盘,然后将该文件上传到磁盘上。
为了创建我正在使用的缩略图CGImageSourceCreateThumbnailAtIndex
(请参阅文档)并使用我刚刚保存的文件的路径创建图像源。
我的问题是,无论我将什么选项传递给图像目的地或缩略图创建调用,我的缩略图总是逆时针旋转 90 度。上传的图像也会旋转。我已经尝试在使用图像的选项中明确设置方向,CGImageDestinationSetProperties
但似乎没有采取。我发现的唯一解决方案是在内存中旋转图像,但我真的想避免这种情况,因为这样做会使缩略图+保存操作完成所需的时间加倍。理想情况下,我希望能够旋转磁盘上的图像。
我在使用方式上是否遗漏了CGImageDestination
什么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"];
path
使用上面的代码保存的文件的路径在哪里。