web-dev-qa-db-ja.com

UIImageを保存し、間違った方向にロードします

次のコードを使用して、ライブラリから選択するか、カメラを使用して取得する画像を保存およびロードします。

//saving an image
- (void)saveImage:(UIImage*)image:(NSString*)imageName {
    NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
    NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
    NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path
    [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
    NSLog(@"image saved");
}

//loading an image
- (UIImage*)loadImage:(NSString*)imageName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]];
    return [UIImage imageWithContentsOfFile:fullPath];
}

これは、選択した画像をUIImageViewに表示するように設定する方法です。

imgView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

ただし、画像を選択して自分のUIImageViewに表示されるように設定すると問題ありませんが、その画像を読み込むと、向きが間違っていることがよくあります。何か案は?誰かがこれを経験したか、私がこれをどのように解決できるか知っていますか?

ありがとう。

編集:

そのため、縦向きで撮影した写真を上下逆に読み込んだ場合は、その向きで読み込まれます。横向きで写真を撮った場合は、その向きで読み込みます。これを回避する方法はありますか?どの方向をロードしても、常にUIImageOrientationUpとして返されます。

39
Josh Kahane

私は同様の問題に直面しました、そしてここに私がそれを解決した方法があります。

画像を保存する間、画像とともにその方向情報を保存する必要があります ...

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:[myImage imageOrientation] forKey:@"kImageOrientation"];
[imageOrientation release];

そして、必要な画像を読み込みますその方向情報を読み取って適用します画像に…

UIImage *tempImage = [[UIImage alloc] initWithContentsOfFile:fullPath];
UIImage *orientedImage= [[UIImage alloc] initWithCGImage: tempImage.CGImage scale:1.0 orientation:imageOrientation];
[tempImage release];

orientedImageが必要です。

おかげで、

28
Ravin

根本的な原因は、PNG形式には画像の向きの情報がないが、JPEG形式にはあることです。したがって、この問題を解決する最も簡単な方法は、UIImageJPEGRepresentation()を使用してファイルをJPEG形式で保存することです。

58
Suyuan Chang

ロードしている画像のEXIF情報を確認します。向きのタグが必要です。値を使用して、画像を適切な方向に回転させます。

このウェブサイトはあなたを始めさせるべきです。

http://www.impulseadventure.com/photo/exif-orientation.html

(写真の表示に使用したアプリケーションには、これが組み込まれている必要があります。そのため、写真を開いたときに正しい方向が表示されます)

3
Derek Li

画像の向きも保存してみてください。その画像を読み込むときに、それが正しい向きであるかどうかを確認し、そうでない場合は、CGAffineTransformまたは必要なもので画像を回転させます。

0
Federico Cella

画像I/Oを使用して、元の画像の向きに基づいてPNG画像をファイル(またはNSMutableData)に保存できます。以下の例では、PNG画像をpathのファイルに保存します。

- (BOOL)savePngFile:(UIImage *)image toPath:(NSString *)path {
    NSData *data = UIImagePNGRepresentation(image);
    int exifOrientation = [UIImage cc_iOSOrientationToExifOrientation:image.imageOrientation];
    NSDictionary *metadata = @{(__bridge id)kCGImagePropertyOrientation:@(exifOrientation)};
    NSURL *url = [NSURL fileURLWithPath:path];
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    if (!source) {
        return NO;
    }
    CFStringRef UTI = CGImageSourceGetType(source);
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, UTI, 1, NULL);
    if (!destination) {
        CFRelease(source);
        return NO;
    }
    CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metadata);
    BOOL success = CGImageDestinationFinalize(destination);
    CFRelease(destination);
    CFRelease(source);
    return success;
}

cc_iOSOrientationToExifOrientation:UIImageカテゴリのメソッドです。

+ (int)cc_iOSOrientationToExifOrientation:(UIImageOrientation)iOSOrientation {
    int exifOrientation = -1;
    switch (iOSOrientation) {
        case UIImageOrientationUp:
            exifOrientation = 1;
            break;

        case UIImageOrientationDown:
            exifOrientation = 3;
            break;

        case UIImageOrientationLeft:
            exifOrientation = 8;
            break;

        case UIImageOrientationRight:
            exifOrientation = 6;
            break;

        case UIImageOrientationUpMirrored:
            exifOrientation = 2;
            break;

        case UIImageOrientationDownMirrored:
            exifOrientation = 4;
            break;

        case UIImageOrientationLeftMirrored:
            exifOrientation = 5;
            break;

        case UIImageOrientationRightMirrored:
            exifOrientation = 7;
            break;

        default:
            exifOrientation = -1;
    }
    return exifOrientation;
}

あるいは、NSMutableDataを使用してCGImageDestinationCreateWithDataに画像を保存し、NSMutableDataの代わりにNSURLCGImageDestinationCreateWithURLに渡すこともできます。

0
KudoCC