Xcodeを初めて使用し(4.3を使用)、デバイスのカメラロールに画像を保存する方法がわかりません。これまでに行ったことは、画像を保存するためのボタンのIBActionを設定することだけです。ユーザーのカメラロールに画像を保存するために使用できるライブラリの方法または機能は何ですか?
5 に答える
関数を使用し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);
}
写真フレームワークを使用したiOS8+の回答は次のとおりです。
Objective-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>
参考までに、同様の方法でビデオを保存できます。
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];
}
Swift4のフォトライブラリに画像を保存します
info.plistに「プライバシー-フォトライブラリの追加使用法の説明」を追加します次に、次のコードを使用して画像を保存します
UIImageWriteToSavedPhotosAlbum(imageView.image!, nil, nil, nil)
asImage()を使用して、カメラロールに保存する一意のコンテンツを取得します。
asImage()を使用すると、わずか数行のコードでさまざまな楽しいものをカメラロールに保存できます。オブジェクトに透明度がすでに組み込まれている場合、これは非常に強力です。
asImage()は、UITextView、WKWebView、UIImageView、UIButton、UISlider、UITableViewと連携して、いくつかのオブジェクトに名前を付けます(ただし、画像を取得するときに表示する必要がある場合があります(アルファがゼロ以外)。タイリングをキャプチャするためにも使用しますが、それはすでに私のデザインのUIImageViewにロードされています。asImage()はもっと多くのオブジェクトタイプでも機能するのではないかと思いますが、私は言及したものだけを試しました。
UITextViewの場合、背景色を.clearに設定すると、テキストは透明な背景で保存されます。テキストに絵文字または絵文字が含まれている場合は、これらの画像をカメラロール、またはアプリ内部のUIImageViewsに取り込むことができます。カメラロールに透明な背景の絵文字/絵文字を配置して、さまざまなアプリケーションで使用できるようにすることは強力です。
写真画像を円にトリミングしたり、角の半径を設定して角を切り取ったりすると、他のオブジェクトにある程度の透明度がある場合があります。
私のコードでは、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!)
}
}
}