我正在研究一些用于CT图像的简单查看器应用程序。 假设我有262144个Int16值的数组。
每个值代表512x512图像中的一个像素。每个像素的值为0到4096,其中0为黑色,4096为白色。
是否有任何优雅,简单的解决方案在Visual Studio Picture Box中显示此图像? 也许是某种MemoryReader或Stream?
我试图搜索某些解决方案,但只找到了有关从数据库中检索二进制数据的主题。
答案 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
答案 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;
}