salut les gars
voila j'essaye de lire une image 2D DICOM mais il y a un problème que j'arrive pas à le repérer il est au niveau d'enregistrement de l'image comme PNG (j'ai essayé aussi JPG) à l'aide de QT
voila la procédure que je suis :
* lire les tag et les afficher ( j'utilise un autre logiciel pour savoir si les tag sont bien affichés et oui ils sont)
* quand j’atteins le TAG PIXEL_DATA =0x7FE00010 je sort de la boucle de lecture de tag
*je calcule le height*width (2 tag déja récupérer) pour savoir le nombre de pixel dans l'image (et ça aussi se déroule très bien la taille la même que celle que donne le logiciel PRO)
*je regard samplesPerPixel et bitsAllocated (2 tag déja récuperer)pour savoir comment l'image est codée bitsallocated prend 8 ou 16 samplesPerPixel soit 1 soit 3
*si bitsallocated est à 8 je recupere height*width bit et je les mis dans un buffer
unsigned char *pixel_8;
*si bitsallocated est à 16 je recupere 2*(height*width) bit et je les mis dans un autre buffer
unsigned short *pixel_16;
J'utilise pour la lecture fread du stdio
maintenant j'utilise juste bitsallocated=16 pas de 8 :p
ensuite je regard dans pixelRepresentation une variable qui contient soit 0: non signed ou 1 :signed
et c'est là ou le probléme se pose :
si j'essaye d'enregistrer l'image comme il est sans transformer les pixel de signer à non signer le programme est planté dans cette l'igne
png_write_rows(png_ptr, row_pointers, 1);
qui est dans qpnghandler.h et j’obtiens la célèbre "violence d'accès à un emplacement privée bla bla "
voila toute la partie intéressante de la fonction où VC se plante (plutôt mon prog . :p)
mais attend j'ai une image (plutot une demi image qui ressamble un peu à la photo que je dois avoir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 case QImage::Format_Mono: case QImage::Format_MonoLSB: case QImage::Format_Indexed8: case QImage::Format_RGB32: case QImage::Format_ARGB32: case QImage::Format_RGB888: { png_bytep* row_pointers = new png_bytep[height]; for (int y=0; y<height; y++) row_pointers[y] = (png_bytep)image.constScanLine(y); png_write_image(png_ptr, row_pointers); delete [] row_pointers; } break; default: { QImage::Format fmt = image.hasAlphaChannel() ? QImage::Format_ARGB32 : QImage::Format_RGB32; QImage row; png_bytep row_pointers[1]; for (int y=0; y<height; y++) { row = image.copy(0, y, width, 1).convertToFormat(fmt); row_pointers[0] = png_bytep(row.constScanLine(0)); png_write_rows(png_ptr, row_pointers, 1); } }
l'image original
ce que j’obtiens
voila aussi la fonction de lecture et d'enregistrement que j'utilise rien de plus facile
avec numPixels=height*widthif (samplesPerPixel == 1 && bitsAllocated == 16)
{
pixel_16=(unsigned char*)malloc(numPixels*2);
fread(pixel_16,1,numPixels*2,dicom_file);
QImage img( (unsigned char *) pixel_16,
width,
height,
QImage::Format_RGB32);
img.save("c:/test.png","PNG");
}
j'utilise QImage::Format_RGB32 mais aussi avec d'autre format j'obtiens toujours des d'erreur l' hors d'enregistrement de l'image
malheureusement c'est la premier fois que je travail sur les images
ce que je demande c'est juste des indications soit au niveau de l’enregistrement de l'image généralement ( je ne sais pas si la méthode que j'utilise est correct ou non ) soit sur mon code
et mille merccii
cordialement warlock
Partager