保存在 UIImageView 中显示的图像

Posted

技术标签:

【中文标题】保存在 UIImageView 中显示的图像【英文标题】:Saving an image displayed in a UIImageView 【发布时间】:2014-10-04 19:46:13 【问题描述】:

我有一组显示在 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】:

如何将图像保存到库中:

你可以使用这个功能:

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

你只需要completionTargetcompletionSelectorcontextInfo,如果你想在UIImage完成保存时得到通知,否则你可以传入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;
    

【讨论】:

以上是关于保存在 UIImageView 中显示的图像的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView - 如果图像高度很小,则将内容向上移动

使用 pangesture 在 UIImageView 图像上绘制贝塞尔路径

如何裁剪 UIScrollView 中显示的 UIImageView 部分并将其保存到 UIImage 变量?

具有 contentMode UIViewContentModeScaleAspectFit 的 UIImageView 的 UILabel

iOS:在 UIImageView 中保存图片

使用多个 CALayers 捕获 UIVIew 的屏幕截图显示白色背景,同时将图像保存在图库中