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.
Ajout de la partie sur les niveaux de gris. Pas intéressé par l'achat de LeadTools. Besoin de code. –
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); –