を使用して写真を撮り、そのサムネイルをアプリに表示し、 (from )UIImagePickerController
を使用してその写真をサーバーに送信する必要があるアプリケーションに取り組んでいます。ASIFormDataRequest
ASIHTTPRequest
私の経験では、生のNSDatasetFile:withFileName:andContentType:forKey:
を使用して画像を送信するよりも高速であるため、ASIFormDataRequestから使用したいと思います。UIImageJPEGRepresentation
そのために、URLを使用して画像の宛先を使用CGImageDestination
および作成し、その画像をディスクに保存してから、そのファイルをディスクにアップロードしています。
使用しているサムネイルを作成しCGImageSourceCreateThumbnailAtIndex
(ドキュメントを参照)、保存したファイルのパスを使用して画像ソースを作成します。
私の問題は、画像の宛先またはサムネイル作成呼び出しにどのオプションを渡しても、サムネイルが常に反時計回りに90度回転して出力されることです。アップロードした画像も回転します。を使用して画像のオプションで向きを明示的に設定しようとしましたCGImageDestinationSetProperties
が、うまくいかないようです。私が見つけた唯一の解決策は、メモリ内の画像を回転させることですが、そうすることでサムネイル+保存操作が完了するまでの時間が2倍になるので、それを避けたいと思います。理想的には、ディスク上の画像を回転できるようにしたいと思います。
使用方法に何かが欠けています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
は上記のコードで保存されたファイルへのパスです。