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