Bir resmi kamera rulosuna nasıl kaydedebilirim?


126

Xcode'da yeniyim (4.3 kullanıyorum) ve bir görüntünün cihazın kamera rulosuna nasıl kaydedileceğinden emin değilim. Şimdiye kadar yaptığım tek şey, görüntüyü kaydetmek için düğme için bir IBAction ayarlamak. Bir görüntüyü kullanıcının film rulosuna kaydetmek için hangi kütüphane yöntemini veya işlevini kullanabilirim?

Yanıtlar:


238

UIImageWriteToSavedPhotosAlbum()İşlevi kullanırsınız .

//Let's say the image you want to save is in a UIImage called "imageToBeSaved"
UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);

Düzenle:

//ViewController.m
- (IBAction)onClickSavePhoto:(id)sender{

    UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil);
}

Diyelim ki '- (IBAction) onClickSavePhoto: (id) gönderen;' ViewController.h dosyamda, yukarıdakileri kullanarak, ViewController.m dosyasına tam olarak ne yerleştirmem gerekir? Tekrar çok teşekkürler!
user1470914

1
@ user1470914 Düzenlememe bakın. Ayrıca, görüntünün kamera rulosuna kaydedilmesini nereden alıyorsunuz? Zaten uygulamanızın paketinde mi yoksa kullanıcı bir resim çekip siz onu kamera rulosuna mı kaydediyorsunuz?
pasawaya

Sabrınız için teşekkürler qegal. Şimdiye kadar bu konuyu tekrar gözden geçirme şansım olmadı. DÜZENLEME bize süper yardımcı oldu. Görüntü, uygulama paketindedir. Uygulamada birkaç resim var ve bunlar küçük küçük resimler olarak görüntülenebilir. Küçük bir küçük resim seçildiğinde, yeni bir görünüme gider ve tam ekran sürümü görüntülenebilir. Üst gezinme bölmesinin sağ köşesinde "kaydet" yazan bir düğme var ve bu, duvar kağıdı olarak uygulanabilmesi için görüntüyü cihazın kamera rulosuna kaydetmek istediğim düğmedir. Yardımınız ve sabrınız için tekrar teşekkürler (casperOne'ın bunu neden kapattığından emin değilim).
user1470914

UIImageView *imageToBeSaved;.H dosyama da ekledim . @synthesize imageToBeSaved
.M dosyama eklemem

4
İOS10'dan itibaren, plist'te NSPhotoLibraryUsageDescription anahtarının kullanılması zorunludur. Aksi takdirde uygulama çöküyor.
ASLLOP

56

İşte Fotoğraflar çerçevesini kullanarak iOS8 + için bir cevap.

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:

// 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
    }
})

İşte Apple belgelerine bir bağlantı .

Fotoğraf kitaplığına erişim izni istemek için info.plistinize uygun anahtarı / değeri eklemeyi unutmayın:

<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
@Ricardopereira
Mansuu


9

Referans için videoları benzer şekilde kaydedebilirsiniz:

UISaveVideoAtPathToSavedPhotosAlbum(videoPath, nil, nil, nil);

Instagram'a yüklemek için bir video kaydetmek isteyebilirsiniz, örneğin:

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

Resmi Swift 4'teki fotoğraf kitaplığına kaydedin

İnfo.plist'e "Gizlilik - Fotoğraf Kitaplığı Eklemeleri Kullanım Açıklamasını" ekleyin

Ardından görüntüyü kaydetmek için aşağıdaki kodu kullanın

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

0

Film rulosuna kaydetmek üzere benzersiz içerik elde etmek için asImage () kullanın.

AsImage () kullanırsanız, sadece birkaç satır kodla çeşitli eğlenceli şeyleri film rulosuna kaydedebilirsiniz! Nesne zaten dahil edilmiş bir şeffaflığa sahipse, bu çok güçlü olabilir.

asImage (), bazı nesneleri adlandırmak için UITextView, WKWebView, UIImageView, UIButton, UISlider, UITableView ile çalışır (ancak görüntüyü aldığınızda görünür olmaları gerekebilir (sıfır olmayan alfaya sahip)). Döşemeyi yakalamak için bile kullanıyorum, ancak bu zaten tasarımımda olan bir UIImageView'a yüklendi. AsImage () 'nın daha birçok nesne türüyle de çalışabileceğinden şüpheleniyorum, ancak sadece bahsettiklerimi denedim.

Bir UITextView ise ve arka plan rengini .clear olarak ayarlarsanız, metin şeffaf bir arka planla kaydedilir. Metniniz emoji veya Memoji içeriyorsa, artık bu görüntüleri kamera rulosuna veya uygulamanızın dahili UIImageViews içine alabilirsiniz. Film rulonuzda her türlü uygulamada kullanılabilecekleri şeffaf bir arka plana sahip Memoji / Emoji olması güçlüdür.

Bir fotoğraf görüntüsünü bir daire şeklinde kırparsanız veya köşe yarıçapını köşelerden kırpacak şekilde ayarlarsanız, diğer nesnelerde bir miktar şeffaflık olabilir.

Kodumdaki not, pointerToTextObjectSelected bir 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.