2011-12-30 4 views
3

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

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, потому что мне с ними комфортно, но я, безусловно, открываю для решения, которое работает.

ответ

5

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

Сфотографируйте

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

EDIT

Чтобы проверить тип файла, который вы можете Examin первый байт 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; 
} 
+0

Как вы проверяете, является ли это .png или .jpeg, что важно при преобразовании его в NSData для его сохранения? – Andrew

+0

@Andrew Проверьте редактирование, вы найдете метод, который будет делать только то, что вы просили. – Cyprian

+0

есть в любом случае, я делаю аргумент этого метода 'UIImage', bec uase, чтобы проверить 'NSData', посмотрите, есть ли его jpeg/png, я должен преобразовать его в NSData. И чтобы преобразовать его в NSData, мне нужно знать, есть ли его jpeg или png. ха-ха – Andrew

3

Как только у вас есть изображение в пользовательском интерфейсе ImageView вы можете решить, чтобы сохранить его в каком формате вы предпочитаете

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 файла

ЕСЛИ я хотел сохранить его как JPEG просто измените imageName на @ "Изображение.JPG»и изменить UIImagePNGRepresentation к UIImageJPEGRepresentation

теперь же изображение сохраняется как JPEG. Вы сами решаете, формат, а затем использовать расширение сопоставления файлов и репрезентации вызов

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