82 votes

Comment enregistrer une image NSImage dans un nouveau fichier ?

Comment puis-je enregistrer une image NSImage comme un nouveau fichier (png, jpg, ...) dans un certain répertoire ?

4 votes

J'ai ajouté une prime puisque quelqu'un a appelé la première option un hack laid et je ne peux pas sembler trouver facilement une réponse apparemment correcte et définitive sur google, plus de vote/réponses s'il vous plaît.

5voto

screenworker Points 31

Style Swift :

if let imgRep = image?.representations[0] as? NSBitmapImageRep
{
      if let data = imgRep.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties: [:])
      {
           data.writeToFile("/path/to/file.png", atomically: false)
      }
}

4voto

Robin Stewart Points 173

Pour aider le code multiplateforme, j'ai implémenté une version de UIImagePNGRepresentation() qui fonctionne sur Mac (et utilise NSImage ).

#if os(macOS)

public func UIImagePNGRepresentation(_ image: NSImage) -> Data? {
    guard let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil)
        else { return nil }
    let imageRep = NSBitmapImageRep(cgImage: cgImage)
    imageRep.size = image.size // display size in points
    return imageRep.representation(using: .png, properties: [:])
}

#endif

Utilisation :

if let data = UIImagePNGRepresentation(myImage) {
    do { try data.write(to: url, options: [.atomic]) }
    catch let error { print("Error writing image (\(error))") }
}

0 votes

Cela a bien fonctionné pour moi, mais j'ai dû supprimer le code imageRep.size = image.size pour conserver la même taille d'image que l'original.

2voto

Kritua Points 54

Solution Objc avec et sans compression

NSImage* image;

// No compression
NSData* data = [image TIFFRepresentation];
// With compression
NSData* data = [image
                TIFFRepresentationUsingCompression:NSTIFFCompressionLZW
                factor:0.5f];

if (data != nil) {
    NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithData:data];
    if (bitmap != nil) {
        NSData* bitmapData = [bitmap
                              representationUsingType:NSBitmapImageFileTypePNG
                              properties:@{}];
        if (bitmapData != nil) {
            [bitmapData
             writeToFile:<file_path>
             atomically:true];
        }
    }
}

1voto

German G. Points 11

Encore une approche garantie pour travailler en utilisant SWIFT :

J'ai un "puits à images" où l'utilisateur peut déposer n'importe quelle image. Et ce "puits à images" possède une propriété d'image (de type NSImage) à laquelle on accède via un outlet :

@IBOutlet weak var imageWell: NSImageView!

Et le code qui sauvegarde cette image (vous pouvez le mettre dans l'action du bouton) est :

if imageWell.image != nil {
   let bMImg = NSBitmapImageRep(data: (imageWell?.image?.TIFFRepresentation)!)
   let dataToSave = bMImg?.representationUsingType(NSBitmapImageFileType.NSJPEGFileType, properties: [NSImageCompressionFactor : 1])
   dataToSave?.writeToFile("/users/user/desktop/image.jpg", atomically: true)
}

Dans la première ligne du code donné, nous vérifions si notre puits d'image a une image.

Dans la deuxième ligne, nous faisons une représentation bitmap de cette image.

À la troisième ligne, nous convertissons notre BitmapRepresentation en un type JPG avec un facteur de compression fixé à "1" (pas de compression).

Dans la 4ème ligne, nous sauvegardons les données JPG avec un chemin donné. "atomiquement : true" signifie que le fichier est sauvegardé en un seul morceau et cela nous assure que l'opération sera réussie.

N.B. : Vous pouvez utiliser un autre NSBitmapImageFileType à la troisième ligne, pour enregistrer votre image dans un autre format. Il y en a beaucoup :

NSBitmapImageFileType.NSBMPFileType
NSBitmapImageFileType.NSGIFFileType
NSBitmapImageFileType.NSPNGFileType

etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X