Archiver des images

UniXUniX Membre
15:51 modifié dans API AppKit #1
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é ????

Réponses

  • 15:51 modifié #2
    Je te conseille la lecture de la doc de la classe NSBitmapImageRep.
  • UniXUniX Membre
    15:51 modifié #3
    Bon, j'ai passé un petit moment à  bouquiner tout ça .... Mais c'est pas trop clair dans ma tête ....

    Quelles sont les grandes lignes de la marche à  suivre ? J'ai pas pigé comment interagissent le NSImage et le NSBitmapImageRep .... :(
  • 15:51 modifié #4
    Tu initialises un imageRep avec cette méthode:
    [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à .
  • UniXUniX Membre
    15:51 modifié #5
    Super, tu as un peu soufflé sur le brouillard ..... :kicking:

    Je vais m'atteler à  tout ça !
  • CéroceCéroce Membre, Modérateur
    15:51 modifié #6
    Est-ce qu'on ne perd pas en qualité en ouvrant le JPEG et en le re-sauvegardant? Il va être compressé à  nouveau, non?
  • AliGatorAliGator Membre, Modérateur
    15:51 modifié #7
    Exact.
  • UniXUniX Membre
    15:51 modifié #8
    Mais moi en fait, l'image ne me sert que de support pour le reste des fonctions de l'appli. En fait, je vais l'enregistrer en jpeg lors de la toute première utilisation, puis je ne ferais que l'ouvrir et la fermer, sans la recompresser, puisque je n'aurais plus à  la modifier.

    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é.
  • 15:51 modifié #9
    Il suffit que le niveau de compression du fichier sauvegardé soit supérieur à  celui d'origine pour que tu n'aies pas l'impression qu'il y ait une perte.
  • CéroceCéroce Membre, Modérateur
    15:51 modifié #10
    dans 1132917818:

    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.
  • AliGatorAliGator Membre, Modérateur
    15:51 modifié #11
    dans 1132917818:

    Mais moi en fait, l'image ne me sert que de support pour le reste des fonctions de l'appli. En fait, je vais l'enregistrer en jpeg lors de la toute première utilisation, puis je ne ferais que l'ouvrir et la fermer, sans la recompresser, puisque je n'aurais plus à  la modifier.

    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, ils perdent.
    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.
  • UniXUniX Membre
    novembre 2005 modifié #12
    Bon, j'ai analysé tout ce que vous m'avez dit, j'ai pas mal consulté la doc et mes bouquins, et avant de me lancer dans le code, je voudrais vous présenter mon but et comment je vois les choses, pour m'assurer que je ne suis pas à  côté de la plaque ....

    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 ?
  • Eddy58Eddy58 Membre
    15:51 modifié #13
    C'est une façon de faire. Personnellement je pense que je m'orienterais plus vers NSFileWrapper pour faire ça. :)
Connectez-vous ou Inscrivez-vous pour répondre.