Gestion d'une image JPEG

WIMPWIMP Membre
07:27 modifié dans API AppKit #1
image étant un NSImage de type .tif, j'obtiens son bitmap par:

<br />NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc]initWithData: [image TIFFRepresentation]];<br />


Je ne parviens pas à  déterminer quel est le code équivalent pour une image jpeg. Une idée ?

Réponses

  • WIMPWIMP Membre
    07:27 modifié #3
    Merci de l'info, mais j'avais déja lu ce topic, et ça ne résoud pas mon pb.

    La methode -(NSData*)representationUsingType:(NSBitmapImageFileType)storageType properties:(NSDictionary *)properties
    permet d'obtenir un NSData à  partir d'un NSBitmapImageRep.
    Et moi je veux obtenir un NSBitmapImageRep à  partir d'un NSImage

    J'ai essayé
    <br />imageData = [NSData dataWithContentsOfFile: imagePath];<br />bitmap = [NSBitmapImageRep imageRepWithData:imageData];<br />
    

    Mais le résultat n'a rien à  voir avec l'image attendue.

    Donc ma question reste posée: comment créer un  NSBitmapImageRep à  partir d'un fichier .jpg ?

    (Le but est de l'utiliser comme texture openGL)
  • 07:27 modifié #4
    Bein, utilise TIFFRepresentation

    NSImage *img=NSImage alloc] initWithContentsOfFile:@&quot;&quot;];<br />imageRep=[NSBitmapImageRep imageRepWithData:[img TIFFRepresentation
    JPEG-DATA=[imageRep representationUsingType...];

  • WIMPWIMP Membre
    07:27 modifié #5
    dans 1143114681:

    Bein, utilise TIFFRepresentation

    NSImage *img=NSImage alloc] initWithContentsOfFile:@&quot;&quot;];<br />imageRep=[NSBitmapImageRep imageRepWithData:[img TIFFRepresentation
    JPEG-DATA=[imageRep representationUsingType...];


    Non, ça ne marche, me suis-je mal expliqué ?
    Je n'ai pas besoin de JPEG-DATA, seulement d'un NSBitmapImageRep, pour avoir un code du genre:
    <br />NSImage *img=[[NSImage alloc] initWithContentsOfFile:@&quot;&quot;];<br />NSBitmapImageRep *bitmap = ????? // f(img)<br />..........<br />glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [bitmap size].width, [bitmap size].height, 0, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GL_RGBA, GL_UNSIGNED_BYTE, [bitmap bitmapData]);<br />
    


    Ce qu'il faudrait c'est un JPEGRepresentation,  mais ça n'existe pas, et je ne trouve pas de moyen de contourner ce problème.
    Je travaille sure une appli qui utilise 72 Mo d'images TIFF, et j'aimerais bien réduire drastiquement cette taille en les remplaçant par des JPEG.
  • BruBru Membre
    07:27 modifié #6
    Je vois vraiment pas sur quoi tu bloques !

    <br />{<br />	NSImage *img;<br />	NSBitmapImageRep *rep1;<br />	NSData *jpeg;<br /><br />	// récupération de l&#39;image<br />	img=[[NSImage alloc] initWithContentsOfFile:@&quot;/AboutBox.tiff&quot;];<br /><br />	// récupération de la 1ère rep de l&#39;image (quelque soit son format)<br />	rep1=[[img representations] objectAtIndex:0];<br /><br />	// création d&#39;une image JPEG à  partir de cette 1ère rep<br />	jpeg=[rep1 representationUsingType:NSJPEGFileType<br />		properties:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:0.2], NSImageCompressionFactor, nil]];<br /><br />	// ajout d&#39;une rep bitmap JPEG à  l&#39;image à  partir de l&#39;image JPEG précédemment créée<br />	[img addRepresentation:[NSBitmapImageRep imageRepWithData:jpeg]];<br /><br />	// suppression de la 1ère rep devenue inutile<br />	[img removeRepresentation:[[img representations] objectAtIndex:0]];<br />}<br />
    


    .
  • WIMPWIMP Membre
    07:27 modifié #7
    Merci de m'aider, mais le code que tu me proposes part d'un fichier .tiff, alors que l'image dont je veux partir est un fichier .jpg.
    A partir d'un .tiff,  je sais faire par:

    <br />NSBitmapImageRep *bitmap;<br />img=[[NSImage alloc] initWithContentsOfFile:@&quot;/AboutBox.tiff&quot;];<br />bitmap = [[NSBitmapImageRep alloc]initWithData: [image TIFFRepresentation]];<br />
    


    Mais dans NSImage il n'y a pas l'équivalent de TIFFRepresentation (JPEGRepresentation par ex.), et à  priori je ne connais pas le taux de compression de mon fichier .jpg... et donc je ne sais pas en tirer un NSData.

    Je vais quand même essayer de me dépatouiller avec tout ça, il faut dire que certains jours la doc Apple me fait penser à  une marmite de spaghettis...
  • BruBru Membre
    07:27 modifié #8
    dans 1143382229:
    Mais dans NSImage il n'y a pas l'équivalent de TIFFRepresentation (JPEGRepresentation par ex.), et à  priori je ne connais pas le taux de compression de mon fichier .jpg... et donc je ne sais pas en tirer un NSData.


    Scuse, mais t'es vraiment bouché !

    Le code que je t'ai donné se base sur une image TIFF, mais pourrait partir de n'importe quel format d'image.
    Si tu as bien lu mon code (comme tu aurais dû bien lire la doc Apple), tu y aurais vu comment créer une NSBitmapImageRep au format JPEG avec un taux de compression de 20%, et ceci quelque soit la source de l'image (.tif , .jpg, .pnt, .bmp, etc...).
    D'ailleurs, où as-tu vu que j'utilisais TIFFRepresentation ?

    Je suis désolé, je ne parle pas le martien courrament, alors je n'ai pas compris ta question de départ.

    .
  • WIMPWIMP Membre
    07:27 modifié #9
    J'ai finalement résolu mon problème.
    En fait, mon code initial utilisant TIFFRepresentation était correct, mais c'est l'utilisation ultérieure du NSBitmapImageRep qui était erronnée:

    L'instruction openGL glTexImage2D créant la texture à  partir du NSBitmapImageRep
    comprend un argument "format" indiquant si l'image contient un canal alpha.
    Comme je mettais toujours GL_RGBA indiquant un canal alpha, une image TIFF était OK et une JPEG toute brouillée.

    Le bon code, qui fonctionne pour tout type d'image est:

    <br />NSimage image;<br />NSBitmapImageRep bitmap;<br />GLenum texFormat;<br /><br />image = [NSImage imageNamed: @&quot;monImage&quot;]; //tout type d&#39;image<br />bitmap = [[NSBitmapImageRep alloc]initWithData: [image TIFFRepresentation]];<br />if ([bitmap hasAlpha]) //alpha channel<br />	texFormat = GL_RGBA;<br />else <br />	texFormat = GL_RGB;<br />.....................<br />glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [bitmap size].width, [bitmap size].height, 0, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; texformat, GL_UNSIGNED_BYTE, [bitmap bitmapData]);<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.