如何将图像保存到相机胶卷?


126

我是Xcode的新手(使用4.3),并且不确定如何将图像保存到设备的相机胶卷中。到目前为止,我所要做的只是为按钮设置了IBAction以保存图像。我可以使用哪种库方法或函数将图像保存到用户的相机胶卷?

Answers:


238

您使用该UIImageWriteToSavedPhotosAlbum()功能。

//Let's say the image you want to save is in a UIImage called "imageToBeSaved"
UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);

编辑:

//ViewController.m
- (IBAction)onClickSavePhoto:(id)sender{

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}

假设我有'-(IBAction)onClickSavePhoto:(id)sender;' 在我的ViewController.h文件中,使用上面的内容,我到底需要在ViewController.m文件中放置什么?再次非常感谢!
user1470914 2012年

1
@ user1470914参见我的编辑。另外,您在哪里将图像保存到相机胶卷?它已经存在于应用程序的捆绑包中吗,或者用户拍照后将其保存到相机胶卷中吗?
pasawaya 2012年

多谢您耐心等待。到目前为止,我还没有机会重温此问题。您的编辑对我们非常有帮助。该图像位于应用程序的捆绑包中。该应用程序中有几张图像,可以将它们视为小缩略图。选择较小的缩略图后,它将进入一个新视图,并且可以查看全屏版本。我在顶部导航的右上角有一个“保存”按钮,这是我希望将图像保存到设备的相机胶卷上的按钮,以便可以将其用作墙纸。再次感谢您的帮助和耐心(不知道为什么casperOne关闭了此功能)。
user1470914 2012年

我还添加UIImageView *imageToBeSaved;了我的.h文件。我以为我必须@synthesize imageToBeSaved在.m中添加,但出现错误,提示“属性实现声明缺少上下文”
user1470914 2012年

4
从iOS10开始,必须在plist中使用NSPhotoLibraryUsageDescription键。否则应用程序崩溃。
ASLLOP

56

这是使用Photos框架的iOS8 +的答案。

目标C:

#import <Photos/Photos.h>

UIImage *snapshot = self.myImageView.image;

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
    changeRequest.creationDate          = [NSDate date];
} completionHandler:^(BOOL success, NSError *error) {
    if (success) {
        NSLog(@"successfully saved");
    }
    else {
        NSLog(@"error saving to photos: %@", error);
    }
}];

迅速:

// Swift 4.0
import Photos

let snapshot: UIImage = someImage

PHPhotoLibrary.shared().performChanges({
    PHAssetChangeRequest.creationRequestForAsset(from: snapshot)
}, completionHandler: { success, error in
    if success {
        // Saved successfully!
    }
    else if let error = error {
        // Save photo failed with error
    }
    else {
        // Save photo failed with no error
    }
})

这是Apple文档的链接

不要忘记将适当的键/值添加到info.plist来请求访问照片库的权限:

<key>NSCameraUsageDescription</key>
<string>Enable camera access to take photos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Enable photo library access to select a photo from your library.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Enable photo library access to save images to your photo library directly from the app.</string>

2
如何获取图像URL @ricardopereira
Mansuu ....


9

作为参考,您可以用类似的方式保存视频:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

您可能想要保存视频以上传到Instagram,例如:

// Save video to camera roll; we can share to Instagram from there.
-(void)didTapShareToInstagram:(id)sender { 
    UISaveVideoAtPathToSavedPhotosAlbum(self.videoPath, self, @selector(video:didFinishSavingWithError:contextInfo:), (void*)CFBridgingRetain(@{@"caption" : caption}));
}

- (void)               video: (NSString *) videoPath
    didFinishSavingWithError: (NSError *) error
                 contextInfo: (void *) contextInfoPtr {

    NSDictionary *contextInfo = CFBridgingRelease(contextInfoPtr);
    NSString *caption         = contextInfo[@"caption"];

    NSString *escapedString   = [videoPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; // urlencodedString
    NSString *escapedCaption  = [caption stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; // urlencodedString

    NSURL *instagramURL       = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@", escapedString, escapedCaption]];

    [[UIApplication sharedApplication] openURL:instagramURL];
}

4

将图像保存在Swift 4的照片库中

在info.plist中添加“隐私-照片库添加用法说明”

然后使用以下代码保存图像

UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)

0

使用asImage()获取要保存到相机胶卷的唯一内容。

如果使用asImage(),只需几行代码就可以将各种有趣的东西保存到相机胶卷中!如果对象已包含一些透明度,则此功能非常强大。

asImage()与UITextView,WKWebView,UIImageView,UIButton,UISlider,UITableView一起使用以命名某些对象(但是在获取图像时(它们的alpha值必须为非零)可能需要可见)。我什至用它来捕获平铺,但是已经将其加载到我的设计中的UIImageView中。我怀疑asImage()可能也可以用于更多对象类型,但是我只尝试了我提到的对象类型。

如果是UITextView,并且将背景色设置为.clear,则文本将以透明背景保存。如果您的文字包含表情符号或Memoji,现在您可以将这些图像放入相机胶卷或应用程序内部的UIImageViews中。在您的相机胶卷中放置具有透明背景的Memoji / Emoji,可以在各种应用程序中使用它们。

如果将照片图像裁剪为圆形,或者将角半径设置为修剪角,则其他对象可能具有一定的透明度。

注意在我的代码中,pointerToTextObjectSelected是一个UITextView


var pointerToTextObjectSelected = UITextView()
// above populated elsewhere

let thisObject = pointerToTextObjectSelected.asImage()

let imageData = thisObject.pngData()

let imageToSave = UIImage(data: imageData!)

UIImageWriteToSavedPhotosAlbum(imageToSave!, nil, nil, nil)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.