[images] afficher tableau de floats graphiquement ?

perifperif Membre
22:37 modifié dans API AppKit #1
Bonjour à  tous,

j'ai des fichiers de données brut ne contenant que des floats. Ceux ci étant regroupés en tableau 2D avec pour taille x et y.
Quelle serait la manière la plus indiquée pour transformer ces floats en une image visible à  l'écran le plus simplement du monde ?
Merci à  vous

Réponses

  • schlumschlum Membre
    22:37 modifié #2
    NSBitmapImageRep
  • AliGatorAliGator Membre, Modérateur
    22:37 modifié #3
    Tes données semblent organisées de la même manière que ce qui est fait dans la famille de formats d'images PPM/PGM/PBM, tu peux peut-être en tirer avantage, voir s'il n'existe pas des outils en ligne de commande pour lire ce format et le transformer en JPG ou PNG par exemple ? Enfin je ne sais pas si c'est la piste à  explorer, mais ça vaut p'tet le coup de jeter un oeil.

    Mais sinon le plus simple en code c'est de créer une NSBitmapImageRep (avec [tt]initWithBitmapDataPlanes:&data pixelsWide:x pixelsHigh:y bitsPerSample:sizeof(float) samplesPerPixel:1 hasAlpha:NO isPlanar:NO colorSpaceName:NSCalibratedWhiteColorSpace bitmapFormat:NSFloatingPointSamplesBitmapFormat bytesPerRow:x bitsPerPixel:0][/tt]) puis de créer une NSImage contenant cette NSBitmapImageRep pour pouvoir l'afficher.

    Je te laisse lire la doc de NSBitmapImageRep pour plus d'infos
    [EDIT]Zut grillé par schlum... bah j'aurais rajouté le coup du format PNM, même si à  mon avis par code NSBitmapImageRep est plus adapté :P)
  • schlumschlum Membre
    22:37 modifié #4
    dans 1240911306:

    [EDIT] Zut grillé par schlum...


    C'est parce que je suis plus radin dans mes réponses  :) (et que j'aime bien laisser les gens se démerder avec la doc avec juste un p'tit bout de réponse  :P)

    Sinon, vu que ce sont des floats, le format kCIFormatRGBAf peut être adapté aussi (possible que je dise des bêtises, n'ayant jamais travaillé avec CIImage ni Core Image en général).

    En tout cas, Core Image bosse avec des float, donc niveau optimisation c'est sans doute l'idéal.
  • perifperif Membre
    22:37 modifié #5
    Merci à  vous :),
    je vais creuser ça tout à  l'heure.
  • perifperif Membre
    22:37 modifié #6
    Salut,

    remontée de topic et nouvelles de mon code.

    En fait je rencontre un problème quant à  l'affichage de mes données, théoriquement cela ressemble à  la première image, mais avec mon code j'obtiens la deuxième image :

    5hzresult.png w1018.png

    imagegxp.png w480.png

    J'ai essayé plusieurs combinaisons pour NSBitmapImageRep mais je n'ai pas réussi à  trouver la solution. Auriez vous une idée ?
    Merci à  vous.

    Voici le code en question :

    NSData * data = [NSData dataWithContentsOfFile:fileName];<br />			unsigned char * plane = (unsigned char *)[data bytes]+sizeof(float)+(x*z);<br />			<br />			<br />			NSBitmapImageRep * rsfRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&amp;plane pixelsWide:x pixelsHigh:z <br />																			 bitsPerSample:sizeof(float) samplesPerPixel:1<br />																			 hasAlpha:NO isPlanar:NO<br />																			 colorSpaceName:NSCalibratedWhiteColorSpace<br />																			 bytesPerRow:x bitsPerPixel:sizeof(float)];<br /><br />			<br />			NSImage* imageFromBundle = [[[NSImage alloc]<br />										 initWithSize:NSMakeSize(x, z)] autorelease];<br />			[imageFromBundle addRepresentation:rsfRep];<br />
    
  • perifperif Membre
    22:37 modifié #7
    C'est bon, finalement j'ai trouvé (le code est moche mais c'était juste pour tester avant du sérieux) :

    float * fdata = (float *)[data bytes];<br />			<br />			<br />			NSBitmapImageRep * rsfRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(unsigned char **)&amp;fdata pixelsWide:x pixelsHigh:z <br />																			 bitsPerSample:32 samplesPerPixel:1<br />																			 hasAlpha:NO isPlanar:NO<br />																			 colorSpaceName:NSCalibratedWhiteColorSpace<br />																			 bitmapFormat:NSFloatingPointSamplesBitmapFormat<br />																			 bytesPerRow:x*4 bitsPerPixel:32];<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.