在PictureBox中渲染16位图像 [英] Render 16 bits image in picturebox

查看:168
本文介绍了在PictureBox中渲染16位图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数组,其中包含从Dicom图像中提取的PixelData.

I have an array which consists in PixelData extracted from a Dicom Image.

代码如下:

        byte[] bytes = img.PixelData.GetFrame(0).Data; // img is the Dicom Image
        int count = bytes.Length / 2;
        ushort[] words = new ushort[count];
        for (int i = 0, p = 0; i < count; i++, p += 2)
        {
            words[i] = BitConverter.ToUInt16(bytes, p);
        }
        pixels16 = words.ToList(); //pixels16 contains now the PixelData for the Grayscale image

现在,这是我的问题,如何将其渲染到Picturebox中?

Now, here's my question, how do I render that into a Picturebox??

推荐答案

我的代码,用于将位图从Format16bppGrayScale转换为Format8bppIndexed格式. PictureBox可以轻松显示此格式. (如果需要,可以使用其他调色板.)

My code for converting Bitmaps from Format16bppGrayScale to Format8bppIndexed format. PictureBox can easy show this format. (If you want, you can use different palette).

public Bitmap Gray16To8bppIndexed(Bitmap BmpIn)
{
    if (BmpIn.PixelFormat != PixelFormat.Format16bppGrayScale)
        throw new BadImageFormatException();

    byte[] ImageData = new byte[BmpIn.Width * BmpIn.Height * 2];
    Rectangle Re = new Rectangle(0, 0, BmpIn.Width, BmpIn.Height);

    BitmapData BmpData = BmpIn.LockBits(Re, ImageLockMode.ReadOnly, BmpIn.PixelFormat);
    Marshal.Copy(BmpData.Scan0, ImageData, 0, ImageData.Length);
    BmpIn.UnlockBits(BmpData);

    byte[] ImageData2 = new byte[BmpIn.Width * BmpIn.Height];
    for (long i = 0; i < ImageData2.LongLength; i++)
        ImageData2[i] = ImageData[i * 2 + 1];
    ImageData = null;

    Bitmap BmpOut = new Bitmap(BmpIn.Width, BmpIn.Height, PixelFormat.Format8bppIndexed);
    BmpData = BmpOut.LockBits(Re, ImageLockMode.WriteOnly, BmpOut.PixelFormat);
    Marshal.Copy(ImageData2, 0, BmpData.Scan0, ImageData2.Length);
    BmpOut.UnlockBits(BmpData);
    ImageData2 = null;
    BmpData = null;

    ColorPalette GrayPalette = BmpOut.Palette;
    Color[] GrayColors = GrayPalette.Entries;
    for (int i = 0; i < GrayColors.Length; i++)
        GrayColors[GrayColors.Length - 1 - i] = Color.FromArgb(i, i, i);
    BmpOut.Palette = GrayPalette;

    return BmpOut;
}

这篇关于在PictureBox中渲染16位图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆