我是Xcode的新手(使用4.3)并且不确定如何将图像保存到设备的相机胶卷。到目前为止我所做的一切都是为按钮保存图像设置IBAction。我可以使用哪种库方法或功能将图像保存到用户的相机胶卷?
答案 0 :(得分:227)
您使用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);
}
答案 1 :(得分:51)
以下是iOS8 +使用Photos框架的答案。
<强>目标-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文档的link。
不要忘记将相应的键/值添加到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 :(得分:8)
作为参考,您可以采用类似的方式保存视频:
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];
}
答案 3 :(得分:1)
然后使用以下代码保存图像
UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)
答案 4 :(得分: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)