it-swarm-id.com

Simpan UIImage, Muat di Orientasi yang Salah

Saya menggunakan kode berikut untuk menyimpan dan memuat gambar yang saya ambil dari perpustakaan atau mengambil menggunakan kamera:

//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];
}

Ini adalah bagaimana saya mengatur gambar yang dipilih untuk ditampilkan di UIImageView saya:

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

Namun, ketika saya mengambil dan memotret dan mengaturnya untuk ditampilkan dalam UIImageView saya, itu baik-baik saja, tetapi ketika saya memuat gambar itu, seringkali itu adalah orientasi yang salah. Ada ide? Adakah yang mengalami ini atau tahu bagaimana saya bisa menyelesaikan ini?

Terima kasih.

EDIT:

Jadi sepertinya, jika Anda memuat foto yang diambil foto dalam potret terbalik, memuat dalam orientasi itu, jika Anda mengambil foto dalam lanskap meninggalkannya memuat dalam orientasi itu. Ada ide bagaimana menyiasatinya? Apapun orientasi yang mereka muat, mereka selalu kembali sebagai UIImageOrientationUp.

35
Josh Kahane

Saya telah menghadapi masalah yang sama dan di sini adalah bagaimana saya menyelesaikannya.

Sementara kita menyimpan gambar, kita perlu menyimpan informasi orientasinya bersama dengan gambar ...

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

Dan kami memuat gambar, kami perlu membaca informasi orientasinya dan menerapkannya ke gambar ...

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

orientedImage adalah yang kita butuhkan.

Terima kasih,

27
Ravin

Penyebab dasarnya adalah format PNG tidak memiliki informasi orientasi gambar, tetapi format JPEG tidak. Jadi cara termudah untuk menyelesaikan masalah ini adalah menyimpan file Anda dalam format JPEG menggunakan UIImageJPEGRepresentation ()

54
Suyuan Chang

Periksa informasi EXIF ​​untuk gambar yang Anda muat, harus ada tag untuk orientasi. Gunakan nilai untuk memutar gambar Anda ke orientasi yang tepat.

Situs web ini harus membantu Anda memulai.

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

(Aplikasi yang Anda gunakan untuk melihat foto harus memiliki built in ini, itu sebabnya Anda melihat orientasi yang benar saat membuka foto)

3
Derek Li

Cobalah untuk menyimpan orientasi gambar juga, maka ketika Anda memuat gambar itu, periksa apakah itu orientasi yang benar, dan jika tidak, putar gambar dengan CGAffineTransform atau apa pun yang Anda inginkan.

0
Federico Cella

Anda dapat menggunakan Gambar I/O untuk menyimpan gambar PNG ke file (atau NSMutableData) sehubungan dengan orientasi gambar asli. Dalam contoh di bawah ini saya menyimpan gambar PNG ke file di 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: adalah metode kategori 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;
}

Anda juga dapat menyimpan gambar ke NSMutableData menggunakan CGImageDestinationCreateWithData dan meneruskan NSMutableData alih-alih NSURL di CGImageDestinationCreateWithURL.

0
KudoCC