Comment faire pour enregistrer un NSImage comme un nouveau fichier
Comment puis-je enregistrer un NSImage comme un nouveau fichier (png, jpg, ...) dans un répertoire particulier?
- J'ai ajouté une prime depuis que quelqu'un a appelé la première option est un vilain hack et je n'arrive pas à trouver facilement une apparence correcte et définitive de réponse sur google , plus de vote/réponses s'il vous plaît.
Vous devez vous connecter pour publier un commentaire.
Faire quelque chose comme ceci:
[* representationUsingType:properties:]: unrecognized selector sent to instance
la solution est ici: NSCGImageSnapshotRep comment obtenir bitmapDataVous pouvez ajouter une catégorie à NSImage comme ce
L'appel à "TIFFRepresentation" est essentiel, sinon vous risquez de ne pas obtenir une image valide.
TIFFRepresentation
de données beaucoup plus importants (5x fois) que le fichier d'origine. est-il normal? dois-je encore envie de le transférer sur le réseau?Pas sûr du reste de vous, mais je préfère manger mon plein enchilada. Ce qui est décrit ci-dessus fonctionne, et rien de mal à cela, mais j'ai trouvé quelques petites choses à gauche. Ici, je vais mettre en évidence mes observations:
même si la résolution de l'image est plus grande que cela. Si vous perdez
résolution
Les fichiers pdf. Allez-y, essayez un GIF animé, vous trouverez l'animation perdu
Donc, si vous voulez convertir cette image, voulez-vous vraiment perdre tout cela?
Si vous souhaitez manger votre repas complet, puis laisse lire...
Et parfois je dis bien parfois, il n'y a rien de mieux que le bon ole de la vieille école de développement. Oui, cela signifie que nous avons à faire un peu de travail!
Nous allons commencer:
J'ai créer une catégorie dans NSData. Ce sont des méthodes de la classe parce que vous voulez ces choses pour être thread-safe et il n'y a rien de plus sûr que de mettre des choses sur la pile. Il existe deux types de méthodes, une pour la sortie de non-multi-pages avec des images et un pour la sortie de multi-images de la page.
Liste des images simples: JPG, PNG, BMP, JPEG-2000
Liste de plusieurs images: PDF, GIF, TIFF
D'abord créer une mutable l'espace de données en mémoire.
Deuxième obtenez un CGImageSourceRef. Ouais sonne moche déjà n'est-ce pas. Il n'est pas mauvais en soit, continuons... Vous voulez vraiment la source de l'image non pas une représentation ou NSImage bloc de données. Cependant, nous avons un petit problème. La source peut être pas compatible, alors assurez-vous de vérifier votre UTI contre ceux énumérés de CGImageSourceCopyTypeIdentifiers()
Code:
Attends, pourquoi est-NSImage là? Eh bien, il ya certains formats qui n'ont pas de métadonnées et CGImageSource ne prend pas en charge, mais ce sont des images valides. Un exemple est de style ancien, des images PICT.
Maintenant, nous avons une CGImageSourceRef, assurez-vous qu'il n'est pas nul et puis il faut maintenant obtenir un CGImageDestinationRef. Wow toutes ces ref est de garder une trace de. Jusqu'à présent, nous sommes à 2!
Nous allons utiliser cette fonction: CGImageDestinationCreateWithData()
kUTTypePNG)
3ème Paramètre est le nombre d'images à enregistrer. Pour les fichiers d'une seule image ce
est 1 sinon, vous pouvez simplement utiliser les éléments suivants:
CGImageSourceGetCount( imageSource );
4ème Paramètre est nul.
Vérifier pour voir si vous avez ce CGImageDestinationRef et maintenant, nous allons ajouter nos images à partir de la source en elle...ce sera également inclure tous les/toutes les métadonnées et de conserver la résolution.
Pour plusieurs des images que l'on boucle:
Pour une seule image, c'est une ligne de code à l'indice 0:
Ok, mettre la dernière main qui écrit sur le disque ou conteneur de données:
De sorte que les Données Mutable au début on a tous notre image de données et de métadonnées dans le maintenant.
Sommes-nous encore? Presque, même avec la collecte des ordures que vous avez à nettoyer!
Rappelez-Ref est une pour la source et l'autre pour la destination afin de faire une CFRelease()
Nous sommes maintenant fait et ce que vous retrouvez avec une image convertie en conservant toutes ses métadonnées, la résolution, etc...
Mon NSData catégorie de méthodes ressembler à ceci:
Que sur le redimensionnement ou ICO /ICNS?
Ce sera pour un autre jour, mais en résumé, vous tout d'abord résoudre le redimensionnement...
Rincez et répétez l'opération pour plusieurs des images incorporées dans la source.
La seule différence entre un ICO et ICNS est que l'on est une seule image, tandis que l'autre est de plusieurs images dans un seul fichier. Pari que vous pouvez deviner qui est qui?! 😉
Pour ces formats, vous devez redimensionner jusqu'à une taille particulière, sinon ERREUR s'ensuivra.
Le processus est exactement le même que lorsque vous utilisez la bonne UTI, mais le redimensionnement est un peu plus stricte.
Ok espérons que cela aide les autres et vous êtes aussi plein que je suis maintenant!
Opps, j'ai oublié de mentionner. Lorsque vous obtenez la NSData objet de faire ce que vous voulez avec elle comme writeToFile, writeToURL, ou diable créer un autre NSImage si vous le souhaitez.
Bon codage!
enregistrer en tant que fichiers PNG à l'aide de swift3
Swift 4.2 Solution
self.self
au lieu deself
? Quelle est la différence?<<Class-Name> <Memory-Address>>
Swift Style:
Juste un plus garanti pour fonctionner approche de l'utilisation de SWIFT:
J'ai une "Image" où l'utilisateur peut déposer n'importe quelle image. Et cette "Image" est une propriété d'image (de type NSImage) accessible via la sortie:
Et le code qui enregistre cette image (vous pouvez le mettre à l'intérieur le bouton de action) est:
Dans la 1ère ligne du code, nous vérifions si notre Image est une image.
Dans la 2ème ligne de nous faire une représentation bitmap de l'image.
Dans la 3e ligne, nous convertissons nos BitmapRepresentation à un JPG type avec un facteur de compression de la valeur "1" (pas de compression).
Dans la 4e ligne nous sauver la JPG de données avec un chemin d'accès donné. "atomiquement: true" signifie que le fichier est enregistré en une seule pièce et qui nous assure que l'opération soit une réussite.
N. B.: Vous pouvez utiliser un autre NSBitmapImageFileType dans la 3e ligne, pour enregistrer votre image sous un autre format. Il a beaucoup:
etc.
Pour aider avec la croix-plate-forme de code, j'ai mis en place une version de
UIImagePNGRepresentation()
qui fonctionne sur Mac (et utiliseNSImage
).Utilisation: