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