Archiver des images
UniX
Membre
Salut.
Mon problème du jour : j'archive des images et beaucoup d'autres choses avec le protocole NSCoder. Jusque là tout va bien ...
Les images à archiver sont précedemment chargée dans une NSImage. Le pb, c'est qu'au départ j'ai par exemple un fichier jpeg de quelques ko, puis une fois archivé, mon fichier pèse plusieurs mo ...!
Je sais que le format des images dans une NSImage est non compressé, mais comment archiver une NSImage dans un format compressé ????
Mon problème du jour : j'archive des images et beaucoup d'autres choses avec le protocole NSCoder. Jusque là tout va bien ...
Les images à archiver sont précedemment chargée dans une NSImage. Le pb, c'est qu'au départ j'ai par exemple un fichier jpeg de quelques ko, puis une fois archivé, mon fichier pèse plusieurs mo ...!
Je sais que le format des images dans une NSImage est non compressé, mais comment archiver une NSImage dans un format compressé ????
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Quelles sont les grandes lignes de la marche à suivre ? J'ai pas pigé comment interagissent le NSImage et le NSBitmapImageRep ....
[tt]+ (id)imageRepWithData:(NSData *)bitmapData[/tt]
Pour avoir la data, tu utilises la méthode [tt]- (NSData *)TIFFRepresentation[/tt] de NSImage.
Une fois que tu as le bitmaprep, l'image n'est plus nécessaire.
Si tu veux sauver dans un autre format que le TIFF, tu utilises le méthode:
[tt]- (NSData *)representationUsingType:(NSBitmapImageFileType)storageType properties:(NSDictionary *)properties[/tt]
Les différents types d'image sont dans les constantes.
Si tu veux changer le niveau de compression (de nouveau les constantes renseignent les valeurs prises par NSTIFFCompression):
[tt]- (void)setCompression:(NSTIFFCompression)compression factor:(float)factor[/tt]
Voilà voilà .
Je vais m'atteler à tout ça !
Mais ça m'ammène une question : comment fonctionnent les logiciels de traitement d'image alors ? Tu ouvres un jpeg, tu le modifies, et tu l'enregistres, mais il ne perd pas en qualité.
Si si, il perd en qualité, ouvre et enregistre 5 fois un même fichier pour t'en convaincre.
Si tu ré-enregistre plusieurs fois un JPEG, il sera recompressé à chaque enregistrement, et tu perdra invariablement en qualité. Mais en général tu perd peu d'un enregistrement à un autre donc ça ne te saute pas aux yeux.
Prend une image, enregistre là en JPEG dans un fichier 1.jpg, puis réouvre ce fichier 1.jpg et sauve le en 2.jpg, etc jusqu'à 10.jpg
à la fin, compare en particulier 1.jpg et 10.jpg...
Ceci dit certains logiciels proposent, comme GraphicConverter, que la sélection colle à aux blocs 16x16 utilisés pour le codage JPEG. Ce qui permet de ne recoder DCT que le ou les blocs modifiés. Attention aux limites de toute façon de ceci, en particulier le lissage entre les blocs qui pourra être gênant si on ne recode que certains blocs... Mais bon.
Mon but est donc d'archiver un objet avec le protocole NSCoding, et qui a une de ses variables d'instances qui est une image. Pour l'instant c'est un NSImage qui prend beaucoup de place sur le disque. Je ne vais donc plus archiver le NSImage, mais un jpeg. Je vais donc ajouter une variable d'instance de type NSData qui contiendra mon jpeg. Je supprime le codage du NSImage, et je rajoute celui du NSData.
Ensuite, la démarche.
Lors de la création de l'objet, j'aurais mon NSImage. Pour remplir le NSData, j'enchaine TIFFRepresentation, imageRepWithData, representationUsingType, ce qui me permet de remplir ma variable d'instance NSData.
Puis j'archive l'objet sur le disque qui ne contiendra donc que le NSData, et plus le NSImage.
Enfin, pour le récupérer, je désarchive l'objet, et je récupère un NSImage avec initWithData de NSImage.
Comme je n'ai pas à modifier l'image, à chaque chargement de l'objet, je n'ai qu'à créer le NSImage à partir du NSData original, et à chaque enregistrement c'est ce même NSData original qui est sauvé.
Est-ce que j'ai juste ?