Я использую mDCM с C # для просмотра тэгов dicom, но я пытаюсь преобразовать данные пикселей в растровое изображение и в конечном итоге в файл JPG. Я прочитал все посты в mDCM Google Group по теме, и все примеры кода либо не работают, либо отсутствуют важные строки кода. Изображение, с которым я работаю, является 16-битным монохромным1 (это упомянутый формат, но на самом деле это 16-битная шкала серого). Я пытался использовать LockBits, SetPixel и небезопасный код для преобразования данных пикселей в растровое изображение, но все попытки не удаются. У кого-нибудь есть какой-нибудь код, который мог бы заставить это работать.
Вот моя последняя попытка с использованием 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++;
}
}
UPDATE:
Я стал ближе, используя LockBits и Marshal.Copy, но изображение получается в радуге цветов вместо оттенков серого. Поэтому я предполагаю, что мне нужен способ преобразования данных в градациях серого в формат 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);
Заранее спасибо
P.S. Прежде чем кто-либо предложит попробовать что-то еще, например ClearCanvas, знайте, что mDCM - единственная библиотека, которая отвечает моим потребностям, и ClearCanvas СЛИШКОМ слишком раздут для того, что мне нужно сделать.