3

を使用して写真を撮り、そのサムネイルをアプリに表示し、 (from )UIImagePickerControllerを使用してその写真をサーバーに送信する必要があるアプリケーションに取り組んでいます。ASIFormDataRequestASIHTTPRequest

私の経験では、生のNSDatasetFile:withFileName:andContentType:forKey:を使用して画像を送信するよりも高速であるため、ASIFormDataRequestから使用したいと思います。UIImageJPEGRepresentationそのために、URLを使用して画像の宛先を使用CGImageDestinationおよび作成し、その画像をディスクに保存してから、そのファイルをディスクにアップロードしています。

使用しているサムネイルを作成しCGImageSourceCreateThumbnailAtIndexドキュメントを参照)、保存したファイルのパスを使用して画像ソースを作成します。

私の問題は、画像の宛先またはサムネイル作成呼び出しにどのオプションを渡しても、サムネイルが常に反時計回りに90度回転して出力されることです。アップロードした画像も回転します。を使用して画像のオプションで向きを明示的に設定しようとしましたCGImageDestinationSetPropertiesが、うまくいかないようです。私が見つけた唯一の解決策は、メモリ内の画像を回転させることですが、そうすることでサムネイル+保存操作が完了するまでの時間が2倍になるので、それを避けたいと思います。理想的には、ディスク上の画像を回転できるようにしたいと思います。

使用方法に何かが欠けていますCGImageDestinationCGImageSource?以下にいくつかのコードを投稿します。

画像の保存:

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は上記のコードで保存されたファイルへのパスです。

4

1 に答える 1

0

私の知る限り、さまざまなことを試した後、これは現在のパブリックAPIでは実行できず、メモリ内で実行する必要があります。

于 2011-09-28T02:51:12.330 に答える