Храните и используйте изображения, поступающие с камеры или альбома в приложении для iPad.

Я разрабатываю приложение для iPad, в котором я позволяю пользователю создавать объект. Также я разрешаю ему/ей добавить 10 изображений к этому объекту. Они могут выбрать эти снимки из фотопленки или сделать новый снимок (если на iPad есть камера).

Теперь мой вопрос: как лучше всего хранить эти фотографии? На мой взгляд, лучше всего было бы использовать метод UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:finishedSavingWithError:contextInfo:), nil);. Таким образом, я всегда могу хранить (или использовать) изображения в фотоальбоме iPad. Но в этом случае мне нужно было бы иметь возможность хранить что-то в базе данных, чтобы иметь возможность снова получить изображение позже. Итак... Как мне получить URL-адрес пути к файлу внутри метода finishedSavingWithError:contextInfo: для сохранения в базе данных?

Другой способ достичь моей цели - сохранить их в личной папке как:

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
        NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
        if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
               UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
               imageView.image = image;

               [ImageManager saveImage:image atIndex:0];
       }
}

И мой метод saveImage делает следующее:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png", index]]; 
[fileManager createFileAtPath:fullPath contents:imageData attributes:nil];

Или я должен хранить изображения как BLOB в базе данных sqlite?

Лично я думаю, что эти последние 2 возможности не работают, потому что в основном вы сохраняете все дважды. Если вы выберете изображение из своей галереи, оно будет храниться локально (в вашей галерее) PLUS в базе данных или в подкаталоге приложения. Что является пустой тратой места.

Каков наилучший способ сделать это с точки зрения производительности?

А также, если я сохраню их в каталоге, сможет ли пользователь получить доступ к этому каталогу и удалить их?

Спасибо, что поделились своей мудростью!


person Jules    schedule 01.08.2011    source источник


Ответы (1)


Я не думаю, что вы можете получить URL/путь к изображению, сохраненному с помощью UIImageWriteToSavedPhotosAlbum

Даже если бы это было возможно, я бы посоветовал вам по-прежнему хранить изображения в своем приложении. Экспортируя их в приложение «Фотографии», вы эффективно отделяете изображения от своего приложения и объекта, для которого они были созданы.

Например, что произойдет, если кто-то удалит изображение из приложения «Фотографии», не осознавая/не помня, что изображение связано с вашим приложением? У вас не было бы возможности предотвратить это.

Что касается метода сохранения (BLOB или файл), то любой из них приемлем. Я бы посоветовал вам изменить размер изображения перед сохранением, если только не требуется исходное изображение в полном размере. Для этого существует множество ресурсов (например, UIImage: изменить размер, затем обрезать)

person Ian L    schedule 01.08.2011
comment
Хотя мне не нужно запрещать им удалять фото. Если они это сделают, это их ошибка, и я могу просто проверить, существует ли изображение. Если нет, я не буду пытаться загрузить его. Но, по крайней мере, это позволяет пользователю упорядочивать изображения так, как он хочет, и я бы не стал использовать вдвое больший объем памяти, чем это действительно необходимо. - person Jules; 02.08.2011
comment
Да, я ценю, что с этим можно справиться очень изящно, я просто думал о пользовательском опыте. (И если предположить, что вы можете изменить размер изображения для целей приложения, память будет меньше чем вдвое). - person Ian L; 02.08.2011
comment
Спасибо за ссылку на полезную ветку изменения размера. Тогда я выберу это решение. Изменение размера изображения до 1024x768 и сохранение его в виде BLOB в базе данных. - person Jules; 03.08.2011