2011-12-30 19 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]; 

私はこれを試してみましたが、得ることができませんでしたそれは動作します

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"]; 

    // 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]); 
    */ 

は、私もこれを試してみましたが、無駄にビュー負荷そしてイメージをロードする

は、私はこれを試みた:

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

を、最終的に、私はNSUserDefeaultsとともに使用NSDataを試みました。

NSUserDefaultsは私が最も気に入っているので使いたいと思っていますが、私は確かに解決策を見つけることができます。

はキャンセルをタップユーザーへの対応ライブラリ

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

から

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

写真を選択して写真を撮る:

答えて

5

は、これは私が使用するものです。

次の方法を用いて、第1のNSDataバイトをexaminできるファイルの種類を確認するには、ユーザー

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

への対応

- (void)imagePickerControllerDidCancel: (UIImagePickerController *) picker { 

    [[picker parentViewController] dismissModalViewControllerAnimated: YES]; 
    [picker release]; 
} 

+ (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

NSDataに変換する際に重要な.pngか.jpegを確認するにはどうすればいいですか? – Andrew

+0

@Andrew編集をチェックすると、あなたが尋ねたことだけを行う方法が見つかるでしょう。 – Cyprian

+0

とにかく、私はそのメソッドの議論を 'UIImage'、bec NSDataを確認するには、そのjpeg/pngがNSDataに変換する必要があるかどうかを確認してください。 NSDataに変換するには、jpegかpngかどうかを知る必要があります。ハハ – Andrew

3

イメージをUIに入れたらImageViewのあなたはNSDataのラインは、PNG形式にUIImageView.imageから画像を変換し、これ.pngのファイル拡張子を持つPNG

として保存されますが

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

を好むどの形式で保存することを決定することができます

JPEGとして保存する場合は imageNameを@ "Image"に変更するだけです。JPGは」とUIImageJPEGRepresentation

は今、同じ画像がJPEGとして保存されます。あなたはフォーマットを決定し、その後、一致するファイルの拡張子と表現・コールを使用するUIImagePNGRepresentation を変更シプリアン答えはあなたの画像を読み取るための方法を提供します

(ファイルからNSDataに)、それがPNGかJPEGなどであることを確認してください。

関連する問題