23

またはを使用せずに変換UIImageする必要があります。photolibからの画像の場合、ここで説明するように、assetlibメソッドを使用できます。ALAssetsLibraryとALAssetを使用して、画像をNSDataとして取り出しますが、キャプチャされた画像の場合、assset urlがないため、変換する必要があります。exifデータを含むバイトに直接、これをどのように達成できますか?助けてくださいNSDataUIImagePngRepresentationUIImageJpegRepresentationUIImage

4

3 に答える 3

18

H・バスタン

あなたのコメントに基づいて:

...ドキュメント ディレクトリの UIImagepicker デリゲート メソッドを使用して、デバイス カメラから返されたキャプチャされた画像を保存したい...

あなたの本当の目標は、EXIF データを含む画像をドキュメント ディレクトリに保存することであり、特に UIImage を EXIF データを含む NSData オブジェクトとして取得することではないようです。その場合、実装で次のことができますimagePickerController:didFinishPickingMediaWithInfo:

// Get your image.
UIImage *capturedImage = [info objectForKey:UIImagePickerControllerOriginalImage];

// Get your metadata (includes the EXIF data).
NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];

// Create your file URL.
NSFileManager *defaultManager = [NSFileManager defaultManager];
NSURL *docsURL = [[defaultManager URLsForDirectory:NSDocumentDirectory
                                         inDomains:NSUserDomainMask] lastObject];
NSURL *outputURL = [docsURL URLByAppendingPathComponent:@"imageWithEXIFData.jpg"];

// Set your compression quuality (0.0 to 1.0).
NSMutableDictionary *mutableMetadata = [metadata mutableCopy];
[mutableMetadata setObject:@(1.0) forKey:(__bridge NSString *)kCGImageDestinationLossyCompressionQuality];

// Create an image destination.
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL((__bridge CFURLRef)outputURL, kUTTypeJPEG , 1, NULL);
if (imageDestination == NULL ) {

    // Handle failure.
    NSLog(@"Error -> failed to create image destination.");
    return;
}

// Add your image to the destination.
CGImageDestinationAddImage(imageDestination, capturedImage.CGImage, (__bridge CFDictionaryRef)mutableMetadata);

// Finalize the destination.
if (CGImageDestinationFinalize(imageDestination) == NO) {

    // Handle failure.
    NSLog(@"Error -> failed to finalize the image.");
}

CFRelease(imageDestination);

私のテストから、実行時間は実行するよりもほぼ同じか速かったです。

NSData *data = UIImageJPEGRepresentation(capturedImage, 1.0);
[data writeToURL:outputURL atomically:YES];

...そして、EXIF データを保持することができます!

UI の応答性を維持したい場合は、バックグラウンド キューにディスパッチすることもできます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    // Do the image saving here...
});

重要な注意:ImageIO.frameworkおよびをターゲットのビルド フェーズに追加MobileCoreServices.frameworkし、イメージの保存を行うクラスにそれらをインポートする必要があります。

#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>

その他の注意事項 この場合、例で提案されているように、イメージを保存するときにジェネレーション ロスを作成していないことを理解しています。UIImage の CGImage プロパティを使用しており、ドキュメントには次のように記載されています。

基礎となる Quartz 画像データ

于 2013-04-07T04:46:41.857 に答える