Сохранение и загрузка UIImages - PullRequest
3 голосов
/ 30 декабря 2011

Итак, в моем приложении я хочу, чтобы пользователь мог выбрать / сделать снимок, а затем показать это изображение в виде UIImageView. Проблема заключается в том, что благодаря моим исследованиям я нашел много способов сохранить / загрузить изображения, но, очевидно, существует проблема с определением, является ли изображение .png или .jpg. Так что я попробовал кучу разных вещей и не могу заставить их работать. Заранее спасибо за любую помощь.

Вот мой код, как только изображение выбрано (я даю пользователю возможность сделать снимок или выбрать изображение из рулона камеры):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    if (!image) image = [info objectForKey:UIImagePickerControllerOriginalImage];

    if (!image)
       return;

    NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *whichPic = @""
    if (whichPicture == pictureA)
        whichPic = @"kpictureA";
    else
        whichPic = @"kpictureB";

    [defaults setObject:imageData forKey:whichPic];
    [defaults synchronize];

Я попробовал это, но не смог заставить его работать:

// Create paths to output images
    NSString  *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Before.png"];
    NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Before.jpg"];

    // Write a UIImage to JPEG with minimum compression (best quality)
    // The value 'image' must be a UIImage object
    // The value '1.0' represents image compression quality as value from 0.0 to 1.0
    [UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];

    // Write image to PNG
    [UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];

    // Let's check to see if files were successfully written...

    // Create file manager
    NSError *error;
    NSFileManager *fileMgr = [NSFileManager defaultManager];

    // Point to Document directory
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

    // Write out the contents of home directory to console
    NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);
    */

Я тоже пробовал это, но безрезультатно:

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
    [library writeImageToSavedPhotosAlbum:[image CGImage] metadata:metadata completionBlock:nil];

Затем, чтобы загрузить изображение при загрузке представления, я попробовал это:

    // Create paths to output images
NSString  *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Before.png"];
NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Before.jpg"];


// Let's check to see if files were successfully written...

// Create file manager
NSError *error;
NSFileManager *fileMgr = [NSFileManager defaultManager];

// Point to Document directory
NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

// Write out the contents of home directory to console
NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);


if ([[fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error] containsObject:@"pictureA.png"]) {
    NSData *imageData = [fileMgr contentsAtPath:@"Documents/Before.png"];
    [pcitureAButton setImage:[UIImage imageWithData:imageData] forState:UIControlStateNormal];
}
else if ([fileMgr contentsAtPath:@"Documents/pictureA.png"]) {
    NSData *imageData = [fileMgr contentsAtPath:@"Documents/pictureA.png"];

    [pictureButton setImage:[UIImage imageWithData:imageData] forState:UIControlStateNormal]; 
}

Тогда я попробовал это:

  if([defaults valueForKey:@"kPictureA"]) {
    UIImage *image = [[UIImage alloc] initWithData:[defaults valueForKey:kPictureA]];
   [pictureAButton setImage:image forState:UIControlStateNormal];
}

и наконец я попробовал использовать NSData с NSUserDefeaults.

Я бы предпочел использовать NSUserDefaults, потому что мне удобнее с ними, но я, конечно, открыт для решения, которое работает.

Ответы [ 2 ]

5 голосов
/ 30 декабря 2011

Это то, что я использую:

Сделайте фотографию

- (IBAction)openCamera:(id)sender{

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES){

        UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
        cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
        cameraUI.allowsEditing = YES;
        cameraUI.delegate = self;
        //Displays only picture option;        
        cameraUI.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];

        [self presentModalViewController: cameraUI animated: YES];

        [cameraUI release];

    }else{
        [self openPhotoLibrary:nil];
    }
}

Выберите фотографию из библиотеки

- (IBAction)openPhotoLibrary:(id)sender{

    UIImagePickerController *libraryPicker = [[UIImagePickerController alloc] init];
    libraryPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    libraryPicker.allowsEditing = YES;
    libraryPicker.delegate = self;
    //Displays only picture option;
    libraryPicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];

    [self presentModalViewController: libraryPicker animated: YES];

    [libraryPicker release];
}

В ответ на нажатие кнопки Отмена.

- (void)imagePickerControllerDidCancel: (UIImagePickerController *) picker {

    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    [picker release];
}

Ответ пользователю, принимающему вновь захваченное изображение

- (void) imagePickerController: (UIImagePickerController *) picker
 didFinishPickingMediaWithInfo: (NSDictionary *) description {

    NSString *mediaType = [description objectForKey: UIImagePickerControllerMediaType];
    UIImage *originalImage, *editedImage, *imageToSave;

    // Handle a still image capture
    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo) {

        editedImage = (UIImage *) [description objectForKey:UIImagePickerControllerEditedImage];
        originalImage = (UIImage *) [description objectForKey:UIImagePickerControllerOriginalImage];

        if (editedImage) {
            imageToSave = editedImage;
        } else {
            imageToSave = originalImage;
        }

        // Save the new image (original or edited) to the Camera Roll
        if(picker.sourceType == UIImagePickerControllerSourceTypeCamera)
            UIImageWriteToSavedPhotosAlbum (imageToSave, nil, nil , nil);


        //Save your UIImage here

        myImage = imageToSave;

    }

    [self dismissModalViewControllerAnimated:YES];
}

РЕДАКТИРОВАТЬ

Для проверки типа файла вы можете проверить первый байт NSDataиспользуя следующий метод:

+ (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];

    switch (c) {
    case 0xFF:
        return @"image/jpeg";
    case 0x89:
        return @"image/png";
    case 0x47:
        return @"image/gif";
    case 0x49:
    case 0x4D:
        return @"image/tiff";
    }
    return nil;
}
3 голосов
/ 25 июня 2012

Когда у вас есть изображение в UIImageView, вы можете сохранить его в том формате, который вы предпочитаете

NSArray  *paths    = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *imageName = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];    
NSData   *imageData  = [NSData dataWithData:UIImagePNGRepresentation(image)];
[imageData writeToFile:imageName atomically:YES];

Строка NSData преобразует изображение из UIImageView.image в формат PNG и, таким образом, сохраняется в виде png с расширением .png

ЕСЛИ я хотел сохранить его в формате JPEG просто измените imageName на @ "Image.jpg" и измените UIImagePNGRepresentation UIImageJPEGRepresentation

Теперь то же изображение сохраняется в формате JPEG. Вы выбираете формат и затем используете соответствующее расширение файла и вызов Представления

Кипрский ответ дает вам способ прочитать изображение (из файла в NSData) и проверить, что это PNG или JPEG и т. Д.

...