[Dcmlib] offset

Olivier Stern olivier.stern at swing.be
Mon May 16 12:04:20 CEST 2005


 

Bonjour,

 

Les trois champs indiqués ont bien la valeur précisée. Je me suis inspiré
d’un code que Jean-Pierre Roux m’a envoyé qui transformait un image
monochrome 8 bits vers une image RGB 3*8 bits ainsi que une image 16 bits
monochrome vers une image 3*16 bits RGB et j’ai effectué la conversion selon
ses conseils (d’ailleurs j obtiens un bon résultat visible si je laisse le
champ 16 bits allocated, mais l image est beaucoup plus foncée que
l’originale). Le else du code suivant correspond au cas ou l’on aurait une
image avec 16bits allocated : (L’image sortante de ce code n est pas lisible
car Offset + image size > file length)

 

Merci,

    Olivier Stern

 

[
]

 

  gdcm::FileHelper *fh = new gdcm::FileHelper( filename );

  size_t dataSize    = fh->GetImageDataSize();

  uint8_t *imageData = fh->GetImageData();

  uint8_t *imageDataRGB = new uint8_t[dataSize*3];

 

[
]

 

  else {

  

    //fh->GetFile()->InsertValEntry( "8", 0x0028, 0x0100); // Bits Allocated

    //fh->GetFile()->InsertValEntry( "8", 0x0028, 0x0101); // Bits Stored

    //fh->GetFile()->InsertValEntry( "7", 0x0028, 0x0102); // High Bit

    //fh->GetFile()->InsertValEntry( "0", 0x0028, 0x0103); // Pixel
Representation

  

    uint16_t maxVal = 0;

    uint16_t minVal = 1000;

    int xSize = fh->GetFile()->GetXSize();

    int ySize = fh->GetFile()->GetYSize();

    // Recherche du pixel à la valeur maximale et minimale

    for (unsigned int i=0;i<dataSize/2;i++) {

      if (((uint16_t *)imageData)[i] > maxVal) {

        maxVal  = ((uint16_t *)imageData)[i];

      }

      if (((uint16_t *)imageData)[i] < minVal) {

        minVal  = ((uint16_t *)imageData)[i];

      }

    }

    for (unsigned int i=0;i<dataSize/2;i++) {

      uint16_t pixel = (((uint16_t *)imageData)[i] - maxVal) * 255  /
(maxVal - minVal);

      imageDataRGB[i*3] = imageDataRGB[i*3+1] = imageDataRGB[i*3+2] =
((uint8_t) pixel);

    }

  }

  

  // Samples Per Pixel  

  

  fh->GetFile()->InsertValEntry( "3 " ,0x0028,0x0002);

  fh->GetFile()->InsertValEntry( "RGB ",0x0028,0x0004 ); // Photometric
Interpretation

  fh->GetFile()->InsertValEntry( "1 ",0x0028,0x0006 ); // Planar
Configuration

   

  // TODO  : free existing PixelData first !

 

   fh->SetImageData(imageDataRGB, dataSize*3);   

  h->WriteDcmExplVR( output );

  // fh->GetFile()->Print();

  gdcm::FileHelper *fh2 = new gdcm::FileHelper( output );

  fh2->GetFile()->InsertValEntry( "8", 0x0028, 0x0100); // Bits Allocated  

  fh2->GetFile()->InsertValEntry( "8", 0x0028, 0x0101); // Bits Stored

  fh2->GetFile()->InsertValEntry( "7", 0x0028, 0x0102); // High Bit

  fh2->GetFile()->InsertValEntry( "0", 0x0028, 0x0103); // Pixel
Representation

  fh2->WriteDcmExplVR( output );

 

  return 0 ;

}

 

 

  _____  

De : Benoit Regrain [mailto:benoit.regrain at creatis.insa-lyon.fr] 
Envoyé : lundi 16 mai 2005 11:31
À : Olivier Stern; Dcmlib at creatis.insa-lyon.fr; 'Jean-Pierre Roux'; 'Mathieu
Malaterre'
Objet : Re: [Dcmlib] offset

 

Peut-on voir les codes que tu as écrit ?

 

Lorsque tu veux modifier le taux d'échantillonage de ton image, tu as 3

champs à modifier : 

   0x0028,0x0100  // Bits Allocted (= 8 dans ton cas)

   0x0028,0x0101); // Bits Stored (= 8 dans ton cas)

   0x0028,0x0102); // High Bit (= 7 dans ton cas)

 

Si ces trois champs ne sont pas cohérents entre eux, il se peux que 

l'écriture ne se fasse pas ou que la lecture de l'image soit incorrecte.

 

Cordialement

Benoit

 

 

REMARQUE

--> aux développeurs... je ne suis pas sur qu'on ait mis des tests

sur ce point la. JPR, tu pourrais vérifier ca et peut-etre meme les ajouter.

Surtout à l'écriture.

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.creatis.insa-lyon.fr/pipermail/dcmlib/attachments/20050516/d1996963/attachment.html>


More information about the Dcmlib mailing list