ฉันจะบันทึกภาพลงในม้วนฟิล์มได้อย่างไร


127

ฉันเพิ่งเริ่มใช้ Xcode (ใช้ 4.3) และไม่แน่ใจว่าจะบันทึกภาพลงในม้วนฟิล์มของอุปกรณ์ได้อย่างไร สิ่งที่ฉันทำจนถึงตอนนี้คือตั้งค่า IBAction สำหรับปุ่มเพื่อบันทึกภาพ ฉันสามารถใช้วิธีการหรือฟังก์ชันไลบรารีใดในการบันทึกภาพลงในม้วนฟิล์มของผู้ใช้

คำตอบ:


239

คุณใช้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) ผู้ส่ง;' ในไฟล์ ViewController.h ของฉันโดยใช้สิ่งที่คุณมีข้างต้นฉันจะต้องวางอะไรในไฟล์ ViewController.m ขอบคุณอีกครั้ง!
user1470914

1
@ user1470914 ดูการแก้ไขของฉัน นอกจากนี้คุณจะบันทึกภาพไปยังม้วนฟิล์มจากที่ไหน มีอยู่ในชุดแอปของคุณแล้วหรือผู้ใช้ถ่ายภาพแล้วบันทึกลงในม้วนฟิล์ม
pasawaya

ขอบคุณสำหรับความอดทนของคุณ qegal ฉันยังไม่มีโอกาสกลับมาทบทวนปัญหานี้อีกเลยจนถึงตอนนี้ การแก้ไขของคุณเรามีประโยชน์มาก รูปภาพอยู่ในชุดรวมของแอป มีรูปภาพหลายรูปในแอพและสามารถดูเป็นภาพขนาดย่อขนาดเล็กได้ เมื่อเลือกภาพขนาดย่อขนาดเล็กจะไปยังมุมมองใหม่และสามารถดูเวอร์ชันเต็มหน้าจอได้ ฉันมีปุ่มที่มุมขวาของการนำทางด้านบนที่เขียนว่า "บันทึก" และนี่คือปุ่มที่ฉันต้องการบันทึกภาพลงในม้วนกล้องของอุปกรณ์เพื่อให้สามารถใช้เป็นวอลเปเปอร์ได้ ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือและความอดทนของคุณ (ไม่แน่ใจว่าเหตุใด casperOne จึงปิดสิ่งนี้)
user1470914

ฉันยังเพิ่มUIImageView *imageToBeSaved;ไฟล์. h ของฉัน ฉันคิดว่าฉันจะต้องเพิ่ม@synthesize imageToBeSavedใน. m ของฉัน แต่ฉันได้รับข้อผิดพลาดที่ระบุว่า "ไม่มีบริบทสำหรับการประกาศการนำคุณสมบัติ"
user1470914

4
ตั้งแต่ iOS10 ขึ้นไปต้องใช้คีย์ NSPhotoLibraryUsageDescription ใน plist อื่น ๆ
ASLLOP

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 ....

@Mansuu โปรดดูที่stackoverflow.com/a/37248867/3641812
ricardopereira

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 ข้อความจะถูกบันทึกด้วยพื้นหลังโปร่งใส หากข้อความของคุณมีอิโมจิหรือ 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.