Bir UIImage dosyasını bir dosyaya nasıl kaydederim?


Yanıtlar:


129

Elbette uygulamanızın belgeler klasöründe alt klasörler oluşturabilirsiniz. Bunu NSFileManageryapmak için kullanıyorsun.

Sen kullanmak UIImagePNGRepresentationNSData görüntüye dönüştürecek ve diske o kaydedin.

// Create path.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];

// Save image.
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];

Bu arada Core Data'nın görüntüleri diske kaydetmeyle ilgisi yoktur.


UIImagePNGRepresentation kullanarak tüm yönelim bilgilerini kaybedersiniz.

1
peki bilgileri kaybetmeden resimleri nasıl kaydedebilirim?
Pol

@Pol, UIImageJPEGRepresentation olarak kaydedebilir veya yönlendirmeyi kendiniz düzeltebilirsiniz, çeşitli çözümler bağlantı stackoverflow.com/questions/3554244/…
user1210182

27

Swift 3'te:

// Create path.
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let filePath = "\(paths[0])/MyImageName.png"

// Save image.
UIImagePNGRepresentation(image)?.writeToFile(filePath, atomically: true)

3
Artık geçerli değil - kullanmanız gerekiyor.write() throws
Andrew K


17

Yukarıdakiler kullanışlıdır, ancak bir alt dizine nasıl kaydedileceği veya bir UIImagePicker'dan nasıl görüntü alınacağı ile ilgili sorunuza yanıt vermezler.

İlk olarak, denetleyicinizin .m veya .h kod dosyasında görüntü seçicinin temsilcisini uyguladığını belirtmelisiniz, örneğin:

@interface CameraViewController () <UIImagePickerControllerDelegate>

@end

Ardından, temsilcinin imagePickerController: didFinishPickingMediaWithInfo: yöntemini uygularsınız; bu, fotoğrafı görüntü seçiciden alıp kaydedebileceğiniz yerdir (tabii ki, kaydetmeyi işleyen başka bir sınıfınız / nesneniz olabilir, ancak ben sadece kodu göstereceğim yöntemin içinde):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // get the captured image
    UIImage *image = (UIImage *)info[UIImagePickerControllerOriginalImage];


    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *imageSubdirectory = [documentsDirectory stringByAppendingPathComponent:@"MySubfolderName"];

    NSString *filePath = [imageSubdirectory stringByAppendingPathComponent:@"MyImageName.png"];

    // Convert UIImage object into NSData (a wrapper for a stream of bytes) formatted according to PNG spec
    NSData *imageData = UIImagePNGRepresentation(image); 
    [imageData writeToFile:filePath atomically:YES];
}

JPEG görüntüsü olarak kaydetmek istiyorsanız, son 3 satır şöyle olacaktır:

NSString *filePath = [imageSubdirectory stringByAppendingPathComponent:@"MyImageName.jpg"];

// Convert UIImage object into NSData (a wrapper for a stream of bytes) formatted according to JPG spec
NSData *imageData = UIImageJPEGRepresentation(image, 0.85f); // quality level 85%
[imageData writeToFile:filePath atomically:YES];

12
extension UIImage {
    /// Save PNG in the Documents directory
    func save(_ name: String) {
        let path: String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let url = URL(fileURLWithPath: path).appendingPathComponent(name)
        try! UIImagePNGRepresentation(self)?.write(to: url)
        print("saved image at \(url)")
    }
}

// Usage: Saves file in the Documents directory
image.save("climate_model_2017.png")

6
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:path atomically:YES];

yol, onu yazmak istediğiniz dosyanın adıdır.


4

Önce Belgeler dizinini almalısınız

/* create path to cache directory inside the application's Documents directory */
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"fileName"];

Ardından fotoğrafı dosyaya kaydetmelisiniz

NSData *photoData = UIImageJPEGRepresentation(photoImage, 1);
[photoData writeToFile:filePath atomically:YES];

4

Swift 4.2'de:

// Create path.
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let filePath = paths.first?.appendingPathComponent("MyImageName.png") {
    // Save image.
    do {
       try image.pngData()?.write(to: filePath, options: .atomic)
    } catch {
       // Handle the error
    }
}

2

Swift 4'te:

// Create path.
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let filePath = paths.first?.appendingPathComponent("MyImageName.png") {
    // Save image.
    do {
       try UIImagePNGRepresentation(image)?.write(to: filePath, options: .atomic)
    }
    catch {
       // Handle the error
    }
}
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.