[Résolu] Crash au chargement d'une image dans IconFamily

kaseykasey Membre
juillet 2008 modifié dans API AppKit #1
Bonjour,
Novice en programmation sur mac, j'essaye de faire une petite application permettant la conversion d'image en .icns a la volée. J'ai trouvé un exemple de programme open source très intéressant sur internet mais même avec l'aide de celui-ci je ne m'en sort pas.

je pense que mon code pourrais aider a comprendre mon problème :
NSString* exPath&nbsp; = [NSString stringWithFormat:@&quot;/Users/kasey/Desktop/MacBookPro.jpg&quot;];<br />	NSString* tmpPath = [NSString stringWithFormat:@&quot;/Users/kasey/Desktop/MacBookPro.jpg&quot;];<br />	NSString* outPath;<br />		<br />	NSImage *image = [[NSImage alloc] initWithContentsOfFile:tmpPath];<br />	<br />	IconFamily *icon = [IconFamily iconFamilyWithThumbnailsOfImage:image];<br />		<br />	outPath = [NSString stringWithFormat:@&quot;%@/%@&quot;, exPath, [tmpPath lastPathComponent]];<br />		<br />	NSString *icnsPath = [NSString stringWithFormat:@&quot;/Users/kasey/Desktop/MacBookPro.icns&quot;];<br />	[icon writeToFile:icnsPath];<br />	[icon setAsCustomIconForFile:icnsPath];<br />


Pour résumer lorsque je lance le programme celui-ci plante a l'intérieur de la ligne suivante :

IconFamily *icon = [IconFamily iconFamilyWithThumbnailsOfImage:image];


Je pense que cela viens d'une mauvaise initialisation de l'objet de ma part...
Si quelqu'un a une idée d'ou peut provenir mon problème  :'(

Réponses

  • 21:01 modifié #2
    Bienvenu sur le site,

    Il y a plusieurs points qui me gène dans ton code:

    NSString* exPath  = [NSString stringWithFormat:@/Users/kasey/Desktop/MacBookPro.jpg];

    Pourquoi utiliser stringWithFormat alors que

    NSString* exPath = @/Users/kasey/Desktop/MacBookPro.jpg;

    suffit. Idem pour la seconde ligne. Il faut l'utiliser lorsque la chaà®ne comprend des tokens introduits par %. Par exemple %d permet d'introduire une valeur entière (32 bits signés).

          NSString* tmpPath = [NSString stringWithFormat:@/Users/kasey/Desktop/MacBookPro.jpg];


        NSString* outPath;
                 
            NSImage *image = [[NSImage alloc] initWithContentsOfFile:tmpPath];
     
    Secondemment, IconFamily n'est pas une classe, il s'agit d'une structure C. De cette manière, il n'est pas possible d'utiliser la syntaxe d'appel de messages de l'Objective C.
    D'autre part, je ne sais où tu as trouvé cette fonction. Je n'ai pas trouvé de référence dans la doc.
    En pour finir, attention certaines fonctions figurant dans Icon Services and Utilities Reference ne sont plus supportées depuis Panther et Léopard.
  • kaseykasey Membre
    21:01 modifié #3
    En effet oui xDev je ne pensait plus a cette façon toute simple d'assigner une chaà®ne de caractère a NSString  >:)

    Par contre pour ce qui est de la icon familly j'ai récupérer ce qui me semble bien être une classe permettant de la gérer ici et plus précisément on retrouve la description de la fonction que j'ai utiliser la

    j'ai réécris mon code comme ceci :

    #import &lt;Foundation/Foundation.h&gt;<br />#include &quot;IconFamily.h&quot;<br /><br />int main (int argc, const char * argv&#91;]) {<br />&nbsp; &nbsp; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br /><br />	NSString* tmpPath = @&quot;/Users/kasey/Desktop/MacBookPro.jpg&quot;;<br /><br />	NSImage *image = [[NSImage alloc] initWithContentsOfFile:tmpPath];<br />	<br />	IconFamily *icon = [IconFamily iconFamilyWithThumbnailsOfImage:image];<br />	<br />	NSString *icnsPath = @&quot;/Users/kasey/Desktop/MacBookPro.icns&quot;;<br />	[icon writeToFile:icnsPath];<br />	[icon setAsCustomIconForFile:icnsPath];<br />	<br />&nbsp; &nbsp; [pool drain];<br />&nbsp; &nbsp; return 0;<br />}
    


    La syntaxe est-elle plus juste?
  • Philippe49Philippe49 Membre
    21:01 modifié #4
    Mais c'est quoi IconFamily.h ? Tu as ajouté un framework ??
    tu compiles avec l'option adéquate ?

    Si tu veux simplement faire une image 128x128 à  partir d'une image, il y a plus simple et tu peux le trouver sur ce site
    un post de Bru
    un post

  • kaseykasey Membre
    21:01 modifié #5
    @Philippe49

    Non non dans mon cas précis j'ai besoins d'icônes, par contre il ne s'agis pas (je crois) d'un framework, mais suivant l'auteur de la classe d'un wrapper.

    IconFamily is a Cocoa/Objective-C wrapper for the Mac OS X Carbon API's "icon family" data type. Its main purpose is to enable Cocoa applications to easily create custom file icons from NSImage instances, and thus take advantage of Mac OS X's new 128x128 RGBA "thumbnail" icon format to provide richly detailed thumbnail previews of the files' contents.


    --> http://iconfamily.sourceforge.net/IconFamily.html

    Je pense avoir bien ajouté les frameworks nécessaires au bon fonctionnement de l'application, mai de toute façon si le problème venais de l'oublis d'un framework la compilation ne passerais pas non?

    J'ai joint mon projet au post si quelqu'un est motivé pour y jeter un oeil :)
  • helgrindhelgrind Membre
    juillet 2008 modifié #6
    dans 1217009209:

    Secondemment, IconFamily n'est pas une classe, il s'agit d'une structure C. De cette manière, il n'est pas possible d'utiliser la syntaxe d'appel de messages de l'Objective C.
    D'autre part, je ne sais où tu as trouvé cette fonction. Je n'ai pas trouvé de référence dans la doc.
    En pour finir, attention certaines fonctions figurant dans Icon Services and Utilities Reference ne sont plus supportées depuis Panther et Léopard.

    Dans ce cas là , IconFamily est bien une classe, que tu peux trouver ici.

    Ton code est correct (mais tu release pas ton image).
    Ca semble être un bug avec les projets de type foundation tool, avec une appli normale ca fonctionne.


  • 21:01 modifié #7

    2008-07-25 22:47:04.633 Erf[11305:10b] _NXCreateWindow: error setting window property (1002)
    2008-07-25 22:47:04.645 Erf[11305:10b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1002) creating CGSWindow'

    À toi de voir maintenant d'où ça vient.. j'ai pas regardé plus je suis crevé
  • kaseykasey Membre
    21:01 modifié #8
    Merci pour votre aide <3 <br />Je vais creuser un peu tout ça !!

    je vous tiens au courant
  • helgrindhelgrind Membre
    21:01 modifié #9
    dans 1217018878:


    2008-07-25 22:47:04.633 Erf[11305:10b] _NXCreateWindow: error setting window property (1002)
    2008-07-25 22:47:04.645 Erf[11305:10b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1002) creating CGSWindow'

    À toi de voir maintenant d'où ça vient.. j'ai pas regardé plus je suis crevé


    Il faut initialiser NSApp au début du code:

    [NSApplication sharedApplication];
    

  • kaseykasey Membre
    21:01 modifié #10
    Yes c'était bien ça :)

    Mais heu j'ai rien compris, qu'est ce que je viens d'ajouter a mon code?

    Merci en tout cas  :kicking:
  • kaseykasey Membre
    21:01 modifié #11
    C'est bon j'ai tout compris après avoir pris un bon patch de mise a jour ^^ --> NSApplication Class Reference

    Mais si cette initialisation est obligatoire d'après ce que j'ai pus lire dans la doc, pourquoi ne pas la mettre dans le template de base?
  • Philippe49Philippe49 Membre
    21:01 modifié #12
    dans 1217021009:

    Mais si cette initialisation est obligatoire d'après ce que j'ai pus lire dans la doc, pourquoi ne pas la mettre dans le template de base?

    Elle est dans les template XCode de base.
  • kaseykasey Membre
    21:01 modifié #13
    Pas dans les foundation tools en tout cas  ???
  • Philippe49Philippe49 Membre
    juillet 2008 modifié #14
    dans 1217025065:

    Pas dans les foundation tools en tout cas  ???


    Ben, on voit pas ce que cela y ferait. Une Foundation tool n'utilise pas AppKit.

    C'est l'inclusion de "IconFamily.h" qui perturbe tout ici.
    Par exemple, NSApplication , NSImage sont dans le framework AppKit. Le #import <Foundation/Foundation.h>  est ici clairement insuffisant. Mais il doit y avoir quelque part dans "IconFamily.h" un #import <Cocoa/Cocoa.h> qui importe à  la fois Foundation et AppKit. Cela sauve ton code visible.

    Quand à  la raison de lancer une instance de NSApplication, là  c'est le mystère, dont l'explication ne peut être que cachée dans l'exécution des méthodes de la librairie. Il faudrait fouiller dans son code pour savoir où. 

    Bref, ici il serait plus logique de choisir une Cocoa-Application qu'une Foundation Tool. C'est pour cela que je disais que [NSApp sharedApplication] n'est pratiquement jamais à  faire, si on choisit évidemment le template correspondant à  ce que l'on veut faire. 
  • kaseykasey Membre
    21:01 modifié #15
    Merci pour ces explications complémentaires, tout s'explique.

    Petit a petit je commence a cerner un peu mieux ce langage.
Connectez-vous ou Inscrivez-vous pour répondre.