2008-10-07 9 views
182

Что мне нужно сделать, чтобы сохранить изображение, которое моя программа сгенерировала (возможно, из камеры, возможно, нет), в библиотеку системных фотографий на iPhone?Как сохранить фотографию в библиотеке фотографий iPhone?

+0

Вы можете проверить [этот код] (http://stackoverflow.com/a/41797659/7030209). Отличный день! – 2017-01-23 00:27:57

ответ

392

Вы можете использовать эту функцию:

UIImageWriteToSavedPhotosAlbum(UIImage *image, 
           id completionTarget, 
           SEL completionSelector, 
           void *contextInfo); 

Вам нужно только completionTarget, completionSelector и contextInfo, если вы хотите получать уведомления, когда UIImage производится экономия, в противном случае вы можете передать в nil ,

См. official documentation for UIImageWriteToSavedPhotosAlbum().

+0

Это работает на симуляторе? – singingAtom 2011-06-22 16:30:48

+6

Да, он работает на симуляторе – pws5068 2011-07-27 22:16:05

+167

Мать коротких функций ..... – Eugene 2012-01-29 12:01:34

10

Просто передать изображения из массива к нему, как так

-(void) saveMePlease { 

//Loop through the array here 
for (int i=0:i<[arrayOfPhotos count]:i++){ 
     NSString *file = [arrayOfPhotos objectAtIndex:i]; 
     NSString *path = [get the path of the image like you would in DOCS FOLDER or whatever]; 
     NSString *imagePath = [path stringByAppendingString:file]; 
     UIImage *image = [[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease]; 

     //Now it will do this for each photo in the array 
     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 
     } 
} 

Извините за опечатка любопытное просто сделал это на лету, но вы получите точку

1

мой последний ответ сделаю ..

для каждого изображения, которое вы хотите сохранить, добавить его в NSMutableArray

//in the .h file put: 

NSMutableArray *myPhotoArray; 


///then in the .m 

- (void) viewDidLoad { 

myPhotoArray = [[NSMutableArray alloc]init]; 



} 

//However Your getting images 

- (void) someOtherMethod { 

UIImage *someImage = [your prefered method of using this]; 
[myPhotoArray addObject:someImage]; 

} 

-(void) saveMePlease { 

//Loop through the array here 
for (int i=0:i<[myPhotoArray count]:i++){ 
     NSString *file = [myPhotoArray objectAtIndex:i]; 
     NSString *path = [get the path of the image like you would in DOCS FOLDER or whatever]; 
     NSString *imagePath = [path stringByAppendingString:file]; 
     UIImage *image = [[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease]; 

     //Now it will do this for each photo in the array 
     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 
     } 
} 
64

Устаревший в iOS 9.0.

Там `гораздо более быстро, то UIImageWriteToSavedPhotosAlbum способ сделать это с помощью Рамочного IOS 4.0+ AssetsLibrary

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    [library writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){ 
    if (error) { 
    // TODO: error handling 
    } else { 
    // TODO: success handling 
    } 
}]; 
[library release]; 
2
homeDirectoryPath = NSHomeDirectory(); 
unexpandedPath = [homeDirectoryPath stringByAppendingString:@"/Pictures/"]; 

folderPath = [NSString pathWithComponents:[NSArray arrayWithObjects:[NSString stringWithString:[unexpandedPath stringByExpandingTildeInPath]], nil]]; 

unexpandedImagePath = [folderPath stringByAppendingString:@"/image.png"]; 

imagePath = [NSString pathWithComponents:[NSArray arrayWithObjects:[NSString stringWithString:[unexpandedImagePath stringByExpandingTildeInPath]], nil]]; 

if (![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:NULL]) { 
    [[NSFileManager defaultManager] createDirectoryAtPath:folderPath attributes:nil]; 
} 
12

Одна вещи, чтобы помнить: Если вы используете функцию обратного вызова, убедитесь, что ваш селектор Удовлетворяет в следующей форме:

- (void) image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo; 

в противном случае, вы будете врезаться с ошибкой, например, как:

[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]

4

При сохранении массива фотографий, не используйте для цикла, сделайте следующее

-(void)saveToAlbum{ 
    [self performSelectorInBackground:@selector(startSavingToAlbum) withObject:nil]; 
} 
-(void)startSavingToAlbum{ 
    currentSavingIndex = 0; 
    UIImage* img = arrayOfPhoto[currentSavingIndex];//get your image 
    UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
} 
- (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo{ //can also handle error message as well 
    currentSavingIndex ++; 
    if (currentSavingIndex >= arrayOfPhoto.count) { 
     return; //notify the user it's done. 
    } 
    else 
    { 
     UIImage* img = arrayOfPhoto[currentSavingIndex]; 
     UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 
    } 
} 
0

Вы можете использовать этот

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    UIImageWriteToSavedPhotosAlbum(img.image, nil, nil, nil); 
}); 
4

В Swift:

// Save it to the camera roll/saved photo album 
    // UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, nil, nil, nil) or 
    UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, self, "image:didFinishSavingWithError:contextInfo:", nil) 

    func image(image: UIImage!, didFinishSavingWithError error: NSError!, contextInfo: AnyObject!) { 
      if (error != nil) { 
       // Something wrong happened. 
      } else { 
       // Everything is alright. 
      } 
    } 
1

Я создал категорию UIImageView для этого, основываясь на некоторых из вышеперечисленных ответов.

Заголовочный файл:

@interface UIImageView (SaveImage) <UIActionSheetDelegate> 
- (void)addHoldToSave; 
@end 

Реализация

@implementation UIImageView (SaveImage) 
- (void)addHoldToSave{ 
    UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = 1.0f; 
    [self addGestureRecognizer:longPress]; 
} 

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     UIActionSheet* _attachmentMenuSheet = [[UIActionSheet alloc] initWithTitle:nil 
                      delegate:self 
                   cancelButtonTitle:@"Cancel" 
                  destructiveButtonTitle:nil 
                   otherButtonTitles:@"Save Image", nil]; 
     [_attachmentMenuSheet showInView:[[UIView alloc] initWithFrame:self.frame]]; 
    } 
    else if (sender.state == UIGestureRecognizerStateBegan){ 
     //Do nothing 
    } 
} 
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0) { 
     UIImageWriteToSavedPhotosAlbum(self.image, nil,nil, nil); 
    } 
} 


@end 

Теперь просто вызвать эту функцию на вашем ImageView:

[self.imageView addHoldToSave]; 

При желании вы можете изменить параметр minimumPressDuration.

4

Ниже функция будет работать. Вы можете скопировать отсюда и вставить туда ...

-(void)savePhotoToAlbum:(UIImage*)imageToSave { 

    CGImageRef imageRef = imageToSave.CGImage; 
    NSDictionary *metadata = [NSDictionary new]; // you can add 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    [library writeImageToSavedPhotosAlbum:imageRef metadata:metadata completionBlock:^(NSURL *assetURL,NSError *error){ 
     if(error) { 
      NSLog(@"Image save eror"); 
     } 
    }]; 
} 
1

В Swift 2,2

UIImageWriteToSavedPhotosAlbum(image: UIImage, _ completionTarget: AnyObject?, _ completionSelector: Selector, _ contextInfo: UnsafeMutablePointer<Void>) 

Если вы не хотите получать уведомления, когда изображение будет сделано сохранение, то вы можете передать ноль в completeTarget, завершениеSelector и contextInfo параметров.

Пример:

UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.imageSaved(_:didFinishSavingWithError:contextInfo:)), nil) 

func imageSaved(image: UIImage!, didFinishSavingWithError error: NSError?, contextInfo: AnyObject?) { 
     if (error != nil) { 
      // Something wrong happened. 
     } else { 
      // Everything is alright. 
     } 
    } 

Важно отметить, что ваш метод, который наблюдает за сохранение изображения должны иметь эти 3 параметра иначе вы столкнетесь с ошибками NSInvocation.

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

 Смежные вопросы

  • Нет связанных вопросов^_^