UIImagePickerController Сохранить на диск, а затем загрузить в UIImageView - PullRequest
2 голосов
/ 12 марта 2010

У меня есть UIImagePickerController, который сохраняет изображение на диск в формате png. Когда я пытаюсь загрузить PNG и установить UIImageView imageView.image в файл, он не отображается.

Вот мой код:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    NSData *imageData = UIImagePNGRepresentation(image);

    // Create a file name for the image
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateStyle:NSDateFormatterShortStyle];
    NSString *imageName = [NSString stringWithFormat:@"photo-%@.png",
                           [dateFormatter stringFromDate:[NSDate date]]];
    [dateFormatter release];

    // Find the path to the documents directory
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    // Now we get the full path to the file
    NSString *fullPathToFile = [documentsDirectory stringByAppendingPathComponent:imageName];

    // Write out the data.
    [imageData writeToFile:fullPathToFile atomically:NO];

    // Set the managedObject's imageLocation attribute and save the managed object context
    [self.managedObject setValue:fullPathToFile forKey:@"imageLocation"];
    NSError *error = nil;
    [[self.managedObject managedObjectContext] save:&error];


    [self dismissModalViewControllerAnimated:YES];
}

Тогда вот как я пытаюсь загрузить его:

self.imageView.backgroundColor = [UIColor lightGrayColor];
self.imageView.frame = CGRectMake(10, 10, 72, 72);
if ([self.managedObject valueForKey:@"imageLocation"] != nil) {
    NSLog(@"Trying to load the imageView with: %@", [self.managedObject valueForKey:@"imageLocation"]);
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:[self.managedObject valueForKey:@"imageLocation"]];
    self.imageView.image = image;

} else {
    self.imageView.image = [UIImage imageNamed:@"no_picture_taken.png"];
}

Я получаю сообщение о том, что он пытается загрузить imageView в отладчике, но изображение никогда не отображается в imageView. Может кто-нибудь сказать мне, что я здесь не так?

Спасибо большое.

Ответы [ 3 ]

7 голосов
/ 13 марта 2010

Вы пишете объект NSData, а не изображение. Вам необходимо снова прочитать объект NSData и преобразовать его в UIImage.

Предполагая, что все остальное правильно, попробуйте это:

NSData *data = [[NSData alloc] initWithContentsOfFile:[self.managedObject valueForKey:@"imageLocation"]];
UIImage *image = [[UIImage alloc] initWithData:data];
1 голос
/ 03 февраля 2012

Использование NSDateFormatterShortStyle приведет к тому, что дата будет представлена ​​как (например) 12/11/12, что испортит имя вашего файла. Он также будет использовать двоеточие в коротком представлении, что недопустимо.

Я бы порекомендовал использовать более нестандартный формат даты, например:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:locale];
[dateFormatter setDateFormat:@"yyyyMMdd-HHmmss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
0 голосов
/ 27 октября 2014

Я использовал этот код в одном из моих тестовых проектов и смоделировал ошибку. Джордан был прав насчет того, чтобы сначала преобразовать его в NSData, прежде чем снова сменить его на UIImage, но реальная проблема здесь заключается в вашем методе именования файлов.

Я заметил, что вы использовали текущую дату и время в качестве имени файла вашего изображения. Сюда входят такие символы, как «:» и «/», которые нельзя использовать в именах файлов. http://www.portfoliofaq.com/pfaq/FAQ00352.htm

В качестве решения я сделал формат даты следующим образом:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyyMddHHmm"]; NSString *imageName = [NSString stringWithFormat:@"photo-%@.png", [dateFormatter stringFromDate:[NSDate date]]];

Надеюсь, это поможет и другим. :)

...