Сохранение и загрузка UIImages

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

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

 - (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 Solutions collect form web for “Сохранение и загрузка UIImages”

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

Сфотографировать

 - (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; } 

Когда у вас есть изображение в 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" и измените представление UIImagePNGR на UIImageJPEGRepresentation

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

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

  • Как показать в UIImage только часть изображения?
  • UIImageView | непризнанный селектор отправлен в экземпляр | Xcode 6.4 | iOS 8.4
  • Рекомендации по определению FastImageCache FICImageFormats?
  • Можем ли мы увеличить изображение до полного размера устройства в качестве медиаплеера в iOS?
  • Как я могу использовать UIImageView с aspectFill и выравнивание вверх?
  • Устройство Retina iOS не отображает изображение @ 2X, оно показывает изображение 1X
  • Режим смешивания iOS умножается
  • UIImageView не всегда отображается
  • BSXPCMessage получил сообщение об ошибке: соединение прерывается
  • Попытка установить границу UIImage
  • Невозможно показать * .gif-файл в UIImageView в swift
  • Interesting Posts

    Интервал ожидания SKAction НЕ согласуется

    Высота расширения iOS8 Today с использованием только автоматической компоновки дает разбитые ограничения

    AVAudioEngine для записи микрофонных и звуковых файлов и предотвращения обратной связи

    Использование 3D-объектов в приложении iOS

    UITextView всегда прокручивается с самого начала при использовании scrollRangeToVisible ()

    iOS – индикаторы страницы страницы UIPageControl не меняются с помощью UISwipeGestureRecognizer

    Кнопка, не работающая в пользовательской выноске

    Ошибка Xcode 5: «Отформатированный или поврежденный файл AST: несогласованный заголовок зонтика в подмодуле»

    Плохой тип процессора в исполняемом файле

    iOS SpriteKit – Шрифт SKLabel Outline (SKShader)

    hex цвета в iOS не точны

    неожиданное «@» в программе

    IOS Swift. Время с даты

    rejectViewControllerAnimated закрыть все контроллеры представления для root

    locationManager: didUpdateLocations вызывается без остановки, когда allowDeferredLocationUpdatesUntilTraveled set?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.