二进制数据的灰度图像

时间:2014-12-29 13:21:56

标签: c# image binary picturebox grayscale

我正在研究一些用于CT图像的简单查看器应用程序。 假设我有262144个Int16值的数组。

每个值代表512x512图像中的一个像素。每个像素的值为0到4096,其中0为黑色,4096为白色。

是否有任何优雅,简单的解决方案在Visual Studio Picture Box中显示此图像? 也许是某种MemoryReader或Stream?

我试图搜索某些解决方案,但只找到了有关从数据库中检索二进制数据的主题。

2 个答案:

答案 0 :(得分:0)

一个好的方法并且具有良好的性能是使用LockBits函数来访问图像数据,使用LockBits可以使用图像的每个字节创建一个Bitmap图像,lockBit将图像数据锁定在内存中以更改每个像素数据位图图像。见这个例子:

  Bitmap bm = new Bitmap(512, 512);
  BitmapData bmd=bm.LockBits(new Rectangle(0, 0, 10, 10), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
  int PixelSize=4;

  for(int y=0; y<bmd.Height; y++)
  {
    byte* row=(byte *)bmd.Scan0+(y*bmd.Stride);
    for(int x=0; x<bmd.Width; x++)
    {
      // Here you change your pixel data
      row[x*PixelSize]=255;
    }
  }
  bm.UnlockBits(bmd)

在pictureBox中绘制你可以只连接pictureBox的成员Image,或者手动绘制方式。请参阅以下示例:

// concatenate 
pict1.Image = bmp;

// Draw using CreateGraphics
Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
g.DrawImage(bmp, new Point(10, 10));

关于灰度,您可以使用一个图像通道的值获得灰度,或者获取RGB值之间的平均值,并对这三个通道使用相同的值,请参阅此示例:

// Average value between channels
Color oc = bmp.GetPixel(i, x);
int grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
Color nc = Color.FromArgb(oc.A, grayScale, grayScale, grayScale);
d.SetPixel(x, y, nc); // if you are using bitmap

// value from one channel
Color pixelColor = c.GetPixel(x, y);
Color newColor = Color.FromArgb(pixelColor.R, pixelColor.R, pixelColor.R);
c.SetPixel(x, y, newColor); // Now greyscale

在此链接中查看有关lockBits的更多信息:http://bobpowell.net/lockingbits.aspx

关于灰度:http://en.wikipedia.org/wiki/Grayscale

答案 1 :(得分:0)

感谢您提供非常有用的信息。 &#39; ave设法自己做了

我的代码:

// stworzenie obrazu i przeskalowanie
    public Bitmap GetBitmap(double scalingFactor)
    {
        Bitmap image = new Bitmap(_width, _height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

        // konwersja palety idexed na skale szarosci
        ColorPalette grayPalette = image.Palette;
        Color[] entries = grayPalette.Entries;
        for (int i = 0; i < 256; i++)
        {
            Color grayC = new Color();
            grayC = Color.FromArgb((byte)i, (byte)i, (byte)i);
            entries[i] = grayC;
        }
        image.Palette = grayPalette;

        // wrzut binary data do bitmapy
        BitmapData dataR = image.LockBits(new Rectangle(Point.Empty, image.Size), ImageLockMode.WriteOnly, image.PixelFormat);
        Marshal.Copy(_rawDataPresented, 0, dataR.Scan0, _rawDataPresented.Length);
        image.UnlockBits(dataR);

        // skalowanie wielkosci
        Size newSize = new Size((int)(image.Width * scalingFactor), (int)(image.Height * scalingFactor));
        Bitmap scaledImage = new Bitmap(image, newSize);

        return scaledImage;
    }