2010-03-29 4 views
0

J'utilise mDCM avec C# pour afficher les balises dicom, mais j'essaye de convertir les données de pixel en bitmap et finalement en un fichier JPG. J'ai lu tous les messages sur le groupe Google mDCM sur le sujet et tous les exemples de code ne fonctionnent pas ou manquent des lignes de code importantes. L'image avec laquelle je travaille est un monochrome1 16 bits (c'est le format mentionné, mais c'est en fait 16 bits en niveaux de gris). J'ai essayé d'utiliser LockBits, SetPixel, et le code dangereux pour convertir les données de pixel en Bitmap mais toutes les tentatives échouent. Quelqu'un at-il un code qui pourrait faire ce travail.Exporter JPG hors de fichier DICOM avec mDCM

Voici ma dernière tentative en utilisant SetPixel:

DcmElement pixelData = this.currentFileFormat.Dataset.GetElement(new DcmTag(DcmConstTags.PixelData)); 
ushort[] pixels = this.currentPixelData.GetFrameDataU16(0); 
this.currentImage = new Bitmap(this.currentPixelData.ImageWidth, this.currentPixelData.ImageHeight, PixelFormat.Format16bppRgb555); 
int resample = (int)Math.Pow(2, (this.currentPixelData.BitsStored - 8)); 

int pxCounter = 0; 
int min = ushort.MaxValue; 
int max = 0; 

for (int c = 0; c < this.currentPixelData.ImageHeight; c++) 
{ 
    for (int r = 0; r < this.currentPixelData.ImageWidth; r++) 
    { 
     ushort pxColor = pixels[pxCounter]; 
     int temp = 255 - (pxColor/resample); 
     if (temp < min) min = temp; 
     if (temp > max) max = temp; 
     this.currentImage.SetPixel(r, c, Color.FromArgb(temp, temp, temp)); 
     pxCounter++; 
    } 
} 

MISE À JOUR: j'ai obtenu plus en utilisant LockBits et Marshal.Copy, mais l'image vient dans un arc en ciel de couleurs au lieu de gris. Donc je suppose que je besoin d'un moyen de convertir les données en niveaux de gris au format RBG:

byte[] pixels = this.currentPixelData.GetFrameDataU8(frameIndex); 
this.currentImage = new Bitmap(this.currentPixelData.ImageWidth, this.currentPixelData.ImageHeight, PixelFormat.Format16bppRgb555); 
BitmapData bitmapData = this.currentImage.LockBits(new Rectangle(0, 0, this.currentImage.Width, this.currentImage.Height), ImageLockMode.ReadWrite, this.currentImage.PixelFormat); 
System.Runtime.InteropServices.Marshal.Copy(pixels, 0, bitmapData.Scan0, this.currentImage.Width * this.currentImage.Height * 2); 
this.currentImage.UnlockBits(bitmapData); 

Merci à l'avance

post-scriptum Avant que quelqu'un ne suggère d'essayer autre chose comme ClearCanvas, sachez que mDCM est la seule bibliothèque qui correspond à mes besoins et ClearCanvas est trop gonflé pour ce que je dois faire.

+0

Ajout de la partie sur les niveaux de gris. Pas intéressé par l'achat de LeadTools. Besoin de code. –

+0

J'ai été en mesure d'aller plus loin en utilisant LockBits et Marshal.Copy en utilisant le code suivant, mais il sort dans un arc-en-ciel de couleurs au lieu de niveaux de gris: byte [] pixels = currentPixelData.GetFrameDataU8 (frameIndex); currentImage = new Bitmap (largeur, hauteur, PixelFormat.Format16bppRgb555); BitmapData bitmapData = currentImage.LockBits (nouveau Rectangle (0, 0, largeur, hauteur), ImageLockMode.ReadWrite, currentImage.PixelFormat); System.Runtime.InteropServices.Marshal.Copy (pixels, 0, bitmapData.Scan0, largeur * hauteur * 2); currentImage.UnlockBits (bitmapData); –

Répondre

1

J'ai finalement pensé à elle, donc si quelqu'un trébuche autre sur ce problème, j'ai pu afficher et enregistrer les images en niveaux de gris 16 bits en utilisant le code à partir d'un article CodeProject. Voici un lien vers cet article:

http://www.codeproject.com/KB/graphics/Image16bit.aspx?msg=3210733

+0

salut ross, je suis resté sur le même problème. je suis incapable de résoudre, êtes-vous méthode de travail approprié pour les valeurs initiales de niveau de la fenêtre. comment vous allez faire cela. merci – prashant

0

Je travaille pour Atalasoft et nous avons une composante d'imagerie qui va le faire pour vous:

DicomDecoder decoder = new DicomDecoder(); 
using (AtalaImage image = decoder.Read(stream, frameIndex, null)) { 
    AtalaImage imageToSave = null; 
    if (image.PixelFormat == PixelFormat.Pixel16bppGrayscale) { 
     imageToSave = image.GetChangedPixelFormat(PixelFormat.Pixel8bppGrayscale); 
    } 
    else if (image.PixelFormat == PixelFormat.Pixel48bppBgr) { 
     imageToSave = image.GetChangedPixelFormat(PixelFormat.Pixel24bppBgr); 
    } 
    else { 
     imageToSave = image; 
    } 
    imageToSave.Save(outputStream, new JpegEncoder(), null); 
    if (imageToSave != image) 
     imageToSave.Dispose(); 
} 

C'est un peu verbeux qu'il doit strictement be - Je voudrais factoriser une routine pour retourner une image dans un format adapté à l'encodeur que vous souhaitez utiliser. Jpeg, en général, est un format de pixels assez limité, il peut gérer, alors que dicom peut encapsuler des formats assez larges. TIFF serait probablement un meilleur choix pour un format de fichier de sortie. J'apporte cela parce que l'objet DicomDecoder gère automatiquement les formats de pixels plus ésotériques de dicom, vous permet de faire des fenêtres et de nivellement (alias, luminosité et contraste) dans l'espace brut de l'image, ainsi que sur les étiquettes, et nous vous donner des contrôles win/web pour afficher AtalaImages, ce qui réduirait probablement la taille de votre application. Il y a, bien sûr, un ensemble de raisons raisonnables pour lesquelles vous pourriez être contraint d'utiliser mDCM, mais je pensais que cela pourrait vous aider (ou d'autres) à voir une autre option.