iOS: преобразование изображения в PNG для сохранения - PullRequest
1 голос
/ 28 марта 2012

Приложение, над которым я работаю, позволяет пользователю выбрать изображение из своей камеры и отобразить его в UIImageView. Теперь у меня возникли проблемы при попытке сохранить данные. Я знаю, что должен преобразовать изображение в PNG и сохранить данные, но у меня возникают некоторые проблемы с этим. Я очень новичок в сохранении файлов и Objective-C в целом. Вот код, который я использую:

- (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename9];
}

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    NSMutableArray *array = [[NSMutableArray alloc] init];

    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image.image)];
    [array addObject:imageData];

    [array writeToFile:[self dataFilePath] atomically:YES];
}
- (void)viewDidLoad
{
    self.imgPicker = [[UIImagePickerController alloc] init];
    self.imgPicker.allowsImageEditing = YES;
    self.imgPicker.delegate = self;
    self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;


    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
        image.image = [array objectAtIndex:0];
    }

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidEnterBackground:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:app];

    [super viewDidLoad];

}

Программа аварийно завершила работу, просто нажав на вкладку, в которой это происходит. Отладчик сообщает «« NSInvalidArgumentException », причина: '- [__ NSCFData _isResizable]: нераспознанный селектор, отправленный экземпляру 0x16cf50' ". Любая помощь очень ценится, спасибо!

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Хорошо, обо всем по порядку, вы получаете эту ошибку, как только вы входите во «вкладку», которая выполняет эти операции, да? Так что ошибка должна быть в вашем методе viewDidLoad. Во-вторых, ваша ошибка вызывает ошибку селектора, поэтому найдите место, где вы использовали @ селектор.

Вот ваша проблема, которая вызывает ошибку:

[[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(applicationDidEnterBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:app];

Обратите внимание, что метод applicationDidEnterBackground имеет параметр (NSNotification *):

- (void)applicationDidEnterBackground:(NSNotification *)notification {

и все же вы отправляете приложение, которое является UIApplication:

UIApplication *app = [UIApplication sharedApplication]

Это единственное, что я могу видеть, это дать вам эту ошибку. Просто измените это на это, и ошибка должна исчезнуть:

- (void)applicationDidEnterBackground:(UIApplication*)application {

НАЧАТЬ РЕДАКТИРОВАТЬ:

Что касается сохранения изображения, я не знаю точно, как вы храните данные, но вот как я это сделаю.

  1. Используйте сохраненное свойство для хранения данных изображения.

ViewController.h

@interface ViewController

//Add this line
@property(retain) NSData* imageData;

@end

ViewController.m

//Remember to include this line somewhere in this file:
@synthesize imageData;

Когда вы собираетесь сохранить файл:

- (void)applicationDidEnterBackground:(UIApplication*)application {
self.imageData = [NSData dataWithData:UIImagePNGRepresentation(image.image)];

[self.imageData writeToFile:[self dataFilePath] atomically:YES];

}

Таким образом, вы не потеряете данные, и вам не нужно использовать массив. Просто добавьте эту строку в метод viewDidUnload:

self.imageData = nil;

КОНЕЦ РЕДАКТИРОВАНИЯ

Надеюсь, это поможет вам.

0 голосов
/ 28 марта 2012

Если ваш UUImage действителен и содержит данные, вы можете просто вызвать

[imageData writeToFile:(NSString*) atomically(BOOL)]

Нет необходимости создавать массив и записывать в него.

...