UIImagePickerController не хватает памяти с источником камеры - PullRequest
2 голосов
/ 15 января 2010

Я получил большую проблему с производительностью, используя UIImagePickerController и сохраняя образ на диск. Я не могу понять, что я делаю неправильно. Вот мой код:

- (void)imagePickerController:(UIImagePickerController *)pick 

didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
    iPixAppDelegate *delegate = (iPixAppDelegate *)[[UIApplication sharedApplication] delegate];
    [delegate addPicture:imageData];    
}

Метод addPicture создает новый объект изображения, который инициализируется следующим образом:

- (Picture*) initPicture:(NSData*)dat inFolder:(NSString*)pat {
    self.data = dat;
    NSDate *d = [NSDate date];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-mm-dd hh-mm-ss"];
    self.name = [[formatter stringFromDate:d] stringByAppendingString:@".png"]; //The name by default of a picture is the date it has been taken
    [formatter release];
    self.path = [pat stringByAppendingPathComponent:self.name];
    if(![self fileExistsAtPath:self.path]){
        [self.data writeToFile:self.path atomically:YES];
    }
    return self;
}

UIImagePickerController довольно быстрый, но программа становится очень медленной, когда я сохраняю изображение на диске.

Есть идеи, что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 15 января 2010

У меня была похожая проблема. То, как я обошел его, заключалось в том, чтобы обрабатывать изображение из сборщика в отдельной цепочке. Моя проблема заключалась в том, что основной поток обрабатывал мое приложение / пользовательский интерфейс вылетал при попытке закрыть средство выбора и обработать изображение:

- (void)imagePickerController:(UIImagePickerController *)picker
    didFinishPickingImage:(UIImage *)image
              editingInfo:(NSDictionary *)editingInfo
{
    [[picker parentViewController] dismissModalViewControllerAnimated:YES];

    NSLog(@"picker did finish");
    [NSThread detachNewThreadSelector:@selector(useImage:) toTarget:self withObject:image];

}
1 голос
/ 15 января 2010

Ваша проблема может быть связана с тем, что вы берете исходное изображение.

Исходное изображение с камеры имеет разрешение около 1200x1400, что является большим объемом памяти и приведет к сбою устройства в случае попыткисделать из него картинку (ей не хватит памяти).

Я бы посоветовал изменить размер изображения, чтобы оно было меньше (родное 320x480).

...