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

我是新的 Xcode (使用4.3) ,不知道如何保存图像的设备的相机滚动。到目前为止,我所做的就是为按钮设置一个 IBAction 来保存图像。我可以使用什么库方法或函数来保存图像到用户的相机滚动?

91056 次浏览

使用 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);
}

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

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

下面是使用 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
}
})

这是苹果文档的 链接

不要忘记向 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>

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

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

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

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

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

如果您使用 asImage () ,只需几行代码就可以将各种有趣的事情保存到相机滚动中!如果对象已经包含了一些透明性,那么这个功能会非常强大。

AsImage ()可以与 UITextView、 WKWebView、 UIImageView、 UIButton、 UISlider、 UITableView 一起命名一些对象(但是当你得到图像时它们可能需要是可见的(有一个非零 alpha))。我甚至使用它来捕获平铺,但是这已经加载到我的设计中的 UIImageView 中了。我怀疑 asImage ()也可以用于更多的对象类型,但是我只尝试了我提到的那些。

如果它是 UITextView,并且将背景颜色设置为。然后文本保存为透明背景。如果你的文字包含表情符号或表情符号,你现在可以把这些图像放入相机卷,或者放入应用程序内部的 UIImageView 中。拥有一个透明的背景在你的相机卷表情符号/表情符号,他们可以在任何种类的应用程序中使用是强大的。

其他对象可能有一些透明度,如果您裁剪照片图像到一个圆,或设置角半径剪切角落。

在我的代码中注意,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)


// You will need this extension :


extension UIView {


// Using a function since `var image` might conflict with an existing variable
// (like on `UIImageView`)
func asImage() -> UIImage {
if #available(iOS 10.0, *) {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
} else {
UIGraphicsBeginImageContext(self.frame.size)
self.layer.render(in:UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return UIImage(cgImage: image!.cgImage!)
}
}
}