保存UIImageView中显示的图像

时间:2014-10-04 19:46:13

标签: ios objective-c uiimageview uiimage

我有一个显示在UICollectionView中的图像数组。

当按下集合视图中的单元格时,该图像将被推送到视图控制器并显示在UIImageView中。

我希望能够按下按钮并将图像保存到用户相机胶卷。

但我这样做有点麻烦......

我认为我的代码与我们的代码不相符,但却无法完成所有工作:

- (IBAction)onClickSavePhoto:(id)sender{

     UIImage *img = [UIImage imageNamed:@"which ever image is being currently displayed in the image view"];

     UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
}

如何操作代码以允许用户保存图像视图中显示的图像?

提前致谢!

更新

在另一篇文章中找到问题的解决方案:

Save image in UIImageView to iPad Photos Library

1 个答案:

答案 0 :(得分:1)

如何将图像保存到库中:

您可以使用此功能:

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

如果您希望在保存UIImage时收到通知,则只需 completionTarget completionSelector contextInfo ,否则你可以传递nil

More info here

据说比使用UIImageWriteToSavedPhotosAlbum更快的方式将图像保存到库中: 使用iOS 4.0+ AVFoundation框架,使用UIImageWriteToSavedPhotosAlbum方法可以做得更快

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

//for non-arc projects
//[library release];

获取UIImageView中任何内容的图像作为屏幕截图:

iOS 7有一个新方法,允许您将视图层次结构绘制到当前图形上下文中。这可以用来非常快速地获得UIImage。

这是UIView上的类别方法,用于将视图作为UIImage获取:

- (UIImage *)takeSnapShot {
    UIGraphicsBeginImageContextWithOptions(self.myImageView.bounds.size, NO, [UIScreen mainScreen].scale);

    [self drawViewHierarchyInRect:self.myImageView.bounds afterScreenUpdates:YES];

    // old style [self.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

它比现有的renderInContext:方法快得多。

参考:https://developer.apple.com/library/ios/qa/qa1817/_index.html

SWIFT更新:执行相同操作的扩展程序:

extension UIView {

    func takeSnapshot() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.myImageView.bounds.size, false, UIScreen.mainScreen().scale);

        self.drawViewHierarchyInRect(self.myImageView.bounds, afterScreenUpdates: true)

        // old style: self.layer.renderInContext(UIGraphicsGetCurrentContext())

        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
}