画像をカメラロールに保存するにはどうすればよいですか?


126

Xcodeを初めて使用し(4.3を使用)、デバイスのカメラロールに画像を保存する方法がわかりません。これまでに行ったことは、画像を保存するボタンのIBActionを設定することだけです。ユーザーのカメラロールに画像を保存するには、どのライブラリメソッドまたは関数を使用できますか?

回答:


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

あなたの忍耐qegalをありがとう。今までこの問題を再検討する機会がありませんでした。あなたの編集はとても役に立ちます。画像はアプリのバンドルにあります。アプリにはいくつかの画像があり、小さなサムネイルとして表示できます。小さなサムネイルを選択すると、新しいサムネイルが表示され、フルスクリーンバージョンを表示できます。上部ナビゲーションの右隅に「保存」というボタンがあります。これは、画像をデバイスのカメラロールに保存して、壁紙として適用できるようにするボタンです。あなたの助けと忍耐に再び感謝します(casperOneがなぜこれを閉じたのかわかりません)。
user1470914

UIImageView *imageToBeSaved;.hファイルにも追加しました。私は追加する必要があろうと思った@synthesize imageToBeSaved私の.mではなく、私は、「プロパティの実装宣言のコンテキストを欠落している」というエラーを取得
user1470914

4
iOS10以降では、plistでNSPhotoLibraryUsageDescriptionキーを使用する必要があります。そうしないと、アプリがクラッシュします。
ASLLOP 2017年

56

これは、写真フレームワークを使用した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>

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と連携して、いくつかのオブジェクトに名前を付けます(ただし、画像(ゼロ以外のアルファを持つ)を取得するときに、それらを表示する必要がある場合があります)。私はタイリングをキャプチャするためにもそれを使用しますが、それはすでにデザインにあるUIImageViewにロードされます。asImage()はさらに多くのオブジェクトタイプでも機能するのではないかと思いますが、私が言及したものだけを試しました。

UITextViewの場合、背景色を.clearに設定すると、テキストは透明な背景で保存されます。テキストに絵文字または絵文字が含まれている場合、これらの画像をカメラロールまたはアプリ内部の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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.