Utiliser Quicktime avec un NSData

CyberbobCyberbob Membre
20:53 modifié dans API AppKit #1
Salut tout le monde,

Cela fait des mois et des mois, que je me suis mis à  regarder le Framework Quicktime. Bon, j'avoue, je n'ai pas regardé pendant 2 mois non-stop !!  :P
Mais bon, j'ai essayé de faire une petite routine me permettant d'importer mon NSDATA qui contient une image TIFF CMJN, et ensuite, l'utiliser pour exporter cette image dans un autre NSDATA différent. J'utilise cette méthode pour pouvoir notamment changer la résolution de l'image.
Bref, je n'arrive pas à  mettre image dans un Graphics Component.

Voici mon code :
-(BOOL)NewQuickImage:(NSBitmapImageRep*) imageRep<br />{<br /><br />	NSData *TIFFData =&nbsp;  [imageRep representationUsingType:NSTIFFFileType properties:nil];<br />	if (TIFFData == nil)<br />		NSLog(@&quot;Impossible d&#39;ouvrir le BMPData&quot;);<br />	else<br />	{<br />		Handle TIFFDatah = NULL;<br />		PtrToHand([TIFFData bytes],&amp;TIFFDatah,[TIFFData length]);<br />		ComponentInstance importComponent = 0,exportComponent = 0;<br />		OSErr err = GetGraphicsImporterForDataRef(TIFFDatah,HandleDataHandlerSubType,&amp;importComponent);<br />		if (err == noErr)<br />		{<br />			Handle newTIFFH = NewHandle(0);<br />			GraphicsExportSetInputGraphicsImporter(exportComponent,importComponent);<br />			GraphicsExportSetOutputHandle(exportComponent,newTIFFH);<br />			GraphicsExportSetResolution(exportComponent,150,150);<br />			unsigned long actualSizeWritten = 0;<br />			err = GraphicsExportDoExport(exportComponent,&amp;actualSizeWritten);<br />			<br />			if (err = noErr)<br />			{<br />				HLock(newTIFFH);<br />				NSData *NewData = [[NSData alloc] init];<br />				NewData = [NSData dataWithBytes:*newTIFFH length:GetHandleSize(newTIFFH)];<br />				[NewData writeToFile:@&quot;/test.tif&quot; atomically:YES];<br />				HUnlock(newTIFFH);<br />			}<br />		<br />		}<br />	}<br />}<br />


J'ai une belle erreur au niveau de la ligne :
OSErr err = GetGraphicsImporterForDataRef(TIFFDatah,HandleDataHandlerSubType,&amp;importComponent);


Une ame charitable peut t'il m'aider ? Je vous avoue que je ne comprend rien au Handle, au DataRef. Je ne trouve pas de doc explicite sur le sujet.

Merci d'avance..

Réponses

  • gifagifa Membre
    20:53 modifié #2
    essais en ajoutant cette ligne de code
    OSType HandleDataHandlerSubType = FOUR_CHAR_CODE('hndl');
  • CoreCore Membre
    20:53 modifié #3
    Peux tu nous en dire plus sur ton erreur et ce qu'y est affiché dans le log.

  • CoreCore Membre
    20:53 modifié #4
    dans 1114580667:

    essais en ajoutant cette ligne de code
    OSType HandleDataHandlerSubType = FOUR_CHAR_CODE('hndl');


    effectivement HandleDataHandlerSubType ne semble pas etre défini dans ton code
  • CyberbobCyberbob Membre
    20:53 modifié #5
    Merci de m'aider les gars ! 

    Il me semblait que HandleDataHandlerSubType était défini dans le framework Quicktime.
    Enfin, je vous ai écouté, je l'ai rajouté, mais toujours pareil. En fait, si je debug, j'ai un erreur : 'Program Received Signal : EXC_BAD_ACCESS'
    au niveau de la ligne
    OSErr err = GetGraphicsImporterForDataRef(TIFFDatah,HandleDataHandlerSubType,&amp;importComponent);
    


    Dans le Run Log : j'ai ça :
    Executable “TiffCocoa” has exited due to signal 11 (SIGSEGV).


  • CoreCore Membre
    20:53 modifié #6
    en même temp le framework quicktime j'y connais rien  :o

    alors c'est bien possible et vu ton message d'erreur ca ne semble effectivement pas venir de là  !
  • amnesicamnesic Membre
    20:53 modifié #7
    tu peux essayer ca pour voir si tu as la même erreur :
    <br />........<br />        Handle TIFFDatah = NULL;<br />        PtrToHand([TIFFData bytes],&amp;TIFFDatah,[TIFFData length]);<br />        ComponentInstance importComponent = 0,exportComponent = 0;<br />        <br />        Handle dataRef = NULL;<br />        PtrToHand( &amp;TIFFDatah, &amp;dataRef, sizeof(Handle));<br /><br />        OSErr err = GetGraphicsImporterForDataRef(dataRef,HandleDataHandlerSubType,&amp;importComponent);<br />..........<br />
    


    Si ca marche pas, peux tu poster un petit projet de test avec une image en entrée à  ta méthode ? (j'ai la flemme d'en écrire un ;))
  • mpergandmpergand Membre
    avril 2005 modifié #8
    <br />PtrToHand([TIFFData bytes],&amp;TIFFDatah,[TIFFData length]);<br />
    


    J'ai un doute sur &TIFFDatah
    Essaye:
    <br />TIFFDatah=NewHandle(0);<br />PtrToHand([TIFFData bytes],TIFFDatah,[TIFFData length]);<br />
    


    Mais sans garantie  :-*

    [edit]
    <br />TIFFDatah=NewHandle(0);<br />PtrAndHand([TIFFData bytes],TIFFDatah,[TIFFData length]);<br />
    

    :)
  • CoreCore Membre
    20:53 modifié #9
    [tt]The PtrToHand function returns, in dstHndl, a newly created handle to a copy of the number of bytes specified by the size parameter, beginning at the location specified by srcPtr. The dstHndl parameter must be a handle variable that is not empty and is not a handle to an allocated block of size 0[/tt]

    Le &TIFFDataH semble justifié, non ?
  • CyberbobCyberbob Membre
    20:53 modifié #10
    Je viens de le faire, et en voyant le header de PtrToHand, il est spécifié qu'il faut un Handle, alors que je passe l'adresse, croyant que c'était un pointeur qui était demandé.
    Cependant, lors du build, j'ai un warning sur le deuxieme argument de PtrToHand...
    Alors du coup, ca passe, sauf que j'ai une erreur -50 qui n'existe pas dans la liste d'Apple des OSErr !
    Et puis, je viens de voir la réponse de Core, il me semble aussi que j'utilise le bon passage de paramètre.

    En fait, je pensais que mon code était mauvais. Je ne sais vraiment plus trop vers quoi me tourner...

  • amnesicamnesic Membre
    20:53 modifié #11
    dans 1114609687:

    Je ne sais vraiment plus trop vers quoi me tourner...

    tu as lu la TN 1195 ?
    http://developer.apple.com/technotes/tn/tn1195.html
    tu as essayé avec les 2 PtrToHand ? ca donne quoi ?
  • mpergandmpergand Membre
    avril 2005 modifié #12
    -50 erreur de paramètres

    il faut donc bien passer l'adresse du dataRef :)

    Bon deuxième tentative  ;D
    <br />Handle dataH=NULL;<br />Handle dataRef=NULL;<br />ptrToHand([TIFFData bytes],&amp;dataH,[tiffData length]);<br />err = PtrToHand( &amp;dataH, &amp;dataRef, sizeof(Handle));<br />....<br />
    


    Un dataRef est un handle qui contient un handle  :o
    j'ai bon ??
  • CyberbobCyberbob Membre
    20:53 modifié #13
    dans 1114610097:

    dans 1114609687:

    Je ne sais vraiment plus trop vers quoi me tourner...

    tu as lu la TN 1195 ?
    http://developer.apple.com/technotes/tn/tn1195.html
    tu as essayé avec les 2 PtrToHand ? ca donne quoi ?



    Alors j'ai essayé les deux PtrToHand, pas d'erreur (err = 0). En revanche, ca ne résout pas le problème.

    Pour répondre à  ta question, j'avais lu une note sur un mec qui avait fait une fonction basée sur la TN.
    Mais je n'avais pas trouvée la TN en question, je pense que c'est celle la, alors je vais la lire de ce pas.

  • amnesicamnesic Membre
    20:53 modifié #14
    attention tu as :
    if (err = noErr) au lieu de if (err == noErr) je pense ;)

    je vais regarder de mon coté sinon ...
  • CoreCore Membre
    20:53 modifié #15
    dans 1114613694:

    attention tu as :
    if (err = noErr) au lieu de if (err == noErr) je pense ;)

    je vais regarder de mon coté sinon ...



    bien joué amnesic
  • amnesicamnesic Membre
    20:53 modifié #16
    Je ne suis pas bien sur de comprendre ce que tu veux faire avec :
    GraphicsExportSetResolution(exportComponent,150,150);

    C'est la résolution (genre passé de 300dpi en 72 dpi) ou bien taille de l'image ?
    car par exemple pour 72dpi il faudrait faire
    GraphicsExportSetResolution(exportComponent, 0x00480000, 0x00480000) d'après la doc ..
    alors je me demande si il n'y a pas confusion de ta part entre résolution et définition ?
  • CyberbobCyberbob Membre
    20:53 modifié #17
    Héhé, merci, mais bon je n'y arrive meme pas encore dans cette condition  :'(

    Enfin, heureusement que tu l'as vu, parce que j'ai l'impression de ne plus rien voir a force de cherche ce qui ne vas pas !

    Va falloir  :fouf): !!
  • CyberbobCyberbob Membre
    20:53 modifié #18
    dans 1114614534:

    Je ne suis pas bien sur de comprendre ce que tu veux faire avec :
    GraphicsExportSetResolution(exportComponent,150,150);

    C'est la résolution (genre passé de 300dpi en 72 dpi) ou bien taille de l'image ?
    car par exemple pour 72dpi il faudrait faire
    GraphicsExportSetResolution(exportComponent, 0x00480000, 0x00480000) d'après la doc ..
    alors je me demande si il n'y a pas confusion de ta part entre résolution et définition ?



    Tu as tout a fait raison sur l'emploi de la méthode, je suis aller un peu vite. (Cyberbob)  >:) En fait, j'ai mis cette ligne rapidement, mais le plus important pour moi c'est d'avoir un GraphicsImporter qui soit bien renseignée, afin d'utilise le graphicsExporter pour pourvoir exporter mon image dans une résolution différente de celle de départ.
    Je parle bien de résolution d'image, c'est à  dire la valeur représentant le nombre de points par pouce.
    Evidemment, ca ne change pas la taille de l'image (en pixels) mais bien la taille d'impression de l'image, lors de l'envoi en impression !
    Donc il faudra que je convertisse à  chaque fois la résolution que je veux en héxa..


    Suis-je un peu plus clair ?
  • amnesicamnesic Membre
    20:53 modifié #19
    dans 1114615052:

    Suis-je un peu plus clair ?


    Complètement ! je ne sais pas pourquoi en voyant 150 x 150 je croyais que tu voulais faire des vignettes et donc changer la taille de l'image...allez fais tourner  :fouf): !

    Bon sinon ton exportComponent semble tjrs a nil ...bref doit manquer un truc à  initialiser ...je continue mes investigations ....
  • amnesicamnesic Membre
    20:53 modifié #20
    ca marche ici avec :
    <br />-(BOOL)NewQuickImage:(NSBitmapImageRep*) imageRep<br />{<br />    <br />    NSData *TIFFData =   [imageRep representationUsingType:NSTIFFFileType properties:nil];<br />    if (TIFFData == nil)<br />        NSLog(@&quot;Impossible d&#39;ouvrir le BMPData&quot;);<br />    else<br />    {<br />        Handle TIFFDatah = NULL;<br />        PtrToHand([TIFFData bytes],&amp;TIFFDatah,[TIFFData length]);<br />        ComponentInstance importComponent = 0,exportComponent = 0;<br />        <br />        Handle dataRef = NULL;<br />        PtrToHand( &amp;TIFFDatah, &amp;dataRef, sizeof(Handle));<br /><br />        OSErr err = GetGraphicsImporterForDataRef(dataRef,HandleDataHandlerSubType,&amp;importComponent);<br />        <br />        if (err == noErr)<br />        {<br />            err = OpenADefaultComponent(GraphicsExporterComponentType, &#39;TIFF&#39;, &amp;exportComponent); <br /><br />            Handle newTIFFH = NewHandle(0);<br />            GraphicsExportSetInputGraphicsImporter(exportComponent,importComponent);<br />            GraphicsExportSetOutputHandle(exportComponent,newTIFFH);<br />            GraphicsExportSetResolution(exportComponent,X2Fix(150.0),X2Fix(150.0));<br />            // GraphicsExportSetDepth(exportComponent, 1); just for my test, easier to see the change ;) <br />            unsigned long actualSizeWritten = 0;<br />            <br />            err = GraphicsExportDoExport(exportComponent,&amp;actualSizeWritten);<br />            <br />            if (err == noErr)<br />            {<br />                HLock(newTIFFH);<br />                NSData *NewData = [[NSData alloc] init];<br />                NewData = [NSData dataWithBytes:*newTIFFH length:GetHandleSize(newTIFFH)];<br />                [NewData writeToFile:@&quot;./barbatruc.tif&quot; atomically:YES];<br />                HUnlock(newTIFFH);<br />            }<br />            <br />        }<br />    }<br />    return TRUE;<br />}<br />
    


    Mon petit doigt me dit que l'on va adorer Core Image ..mais chut encore 2j ;)
  • CyberbobCyberbob Membre
    20:53 modifié #21
    Franchement, tu taquines !!! Il ne me manquait pas grand chose en fait ! Oui je suis content !!  <3 <br />
    En tout cas, merci beaucoup. D'ailleurs pour aider qq'un si jamais il aurait envie d'utiliser quicktime pour gérer des images, je vais poster d'ici un jour des bouts de codes pour obtenir des informations sur les images..

    Qui sait, ca peut aider ? ;)

    PS : Joli le X2Fix , connaissais pas moi  ???
  • CyberbobCyberbob Membre
    20:53 modifié #22
    Héhé, avant de poster, je viens de me rendre compte que je n'utilisais pas de compressionp pour mes images. Pas de problèmes, Quicktime doit avoir ça. Je vais voir dans la doc d'apple, et je lis que depuis la version 4, Quicktime supporte la compression PackBits, LZW...
    Sauf que nulle part je ne vois le paramètres LZW. Quand je demande à  mon graphics Exporter les settings du format TIFF, dans la liste je n'ai pas LZW. J'ai que PackBits.
    Et ce que vous aussi , vous avez ça ?

    PS : J'ai mis à  jour Quicktime.. (faut t'il une version PRO ??  B) )

Connectez-vous ou Inscrivez-vous pour répondre.