C#生成单色位图的方法
2008-08-21 17:34:50| 分类: 软件设计 | 标签: |字号大中小 订阅
在采集单色相机图像及在一些科学计算中需要生成单色位图在屏幕上显示出来。在 C#中生成单色位
图有两种方法,第一种方法是先生成一个单色 Bitmap 对象,然后修改其调色板,填充图像数据,这种方法
适用于只在初始化时生成一个 Bitmap 对象,而每次调用只修改图像数据等需要连续显示图像的场合;第二
种是在内存中直接生成 DIB 位图文件,然后由此内存文件生成 Bitmap 对象,这种方法适用于每次调用都
需要生成一个单独的 Bitmap 对象等不需要连续显示图像的场合,因为每次调用都要生成 Bitmap 对象,当
用于连续图像显示时资源消耗要大些。
需要注意的是,在 windows 的位图显示中,要求图像每行上的图像数据大小是 4 字节的整数倍,因
此在分析下面的代码时可以看到,在填充 Bitmap 的图像数据时,对原始图像数据尺寸进行了判断,根据需
要在每行上进行了数据补充。
先生成一个单色 Bitmap 对象,然后填充图像数据方法
完整代码如下:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;
using System.Text;
namespace App
{
/// <summary>
/// 生成并显示单色位图。
/// 使用先生成一个单色 Bitmap 对象,然后填充图像数据的方法
/// </summary>
public class MonochromaticImageDrawer
{
private Control view;
private Size imageSize; //图像尺寸
private Rectangle imageRect;
private int rowPadPixels; //每行上补充的像素数(补充到每行图像数据大小为 4 字节的整数倍)
private byte[] bitmapDataBuffer; //补充像素后的图像数据缓冲区
private Bitmap bitmap;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="viewControl">
/// 输入参数 viewControl 为用户界面中一个用来显示图像的窗口控件,如:Panel,Picture 等控件。
/// </param>
/// <param name="_imageSize">
/// _imageSize 为原始图像尺寸。
/// </param>
public MonochromaticImageDrawer(Control viewControl, Size _imageSize)
{
view = viewControl;
imageSize = _imageSize;
imageRect = new Rectangle(new Point(0, 0), imageSize);
//计算补充像素
rowPadPixels = imageSize.Width % 4;
if (rowPadPixels > 0)
rowPadPixels = 4 - rowPadPixels;
bitmapDataBuffer = new byte[(imageSize.Width + rowPadPixels) * imageSize.Height];
bitmap = new Bitmap(imageSize.Width, imageSize.Height, PixelFormat.Format8bppIndexed);
CreatePalette(bitmap);
}
//显示 8bit 深度的位图
//upperLeft 为图像左上方在窗口中的位置
public bool UpdateImageData(byte[] buf,Point upperLeft)
{
Debug.Assert(buf.Length == imageSize.Width * imageSize.Height, "图像数据的大小与
MonochromaticImageDrawer 构造函数中指定的大小不一致");
PadPixel(buf);
Draw(upperLeft);
return true;
}
//显示 16bit 深度的位图
//topValue:饱和值,值>=topValue 的像素显示为 colorList[255]的颜色
private byte[] b8Buffer=null; //用于存放将 16bit 深度的图像数据压缩为 8bit 深度的缓冲区
public bool UpdateImageData(UInt16[] buf, Point upperLeft, int topValue)
{
Debug.Assert(buf.Length == imageSize.Width * imageSize.Height, "图像数据的大小与
MonochromaticImageDrawer 构造函数中指定的大小不一致");
if (b8Buffer == null) b8Buffer = new byte[imageSize.Width * imageSize.Height];
//压缩为 8bit
double f = 255.0 / topValue;
double d;
for (int i = 0; i < buf.Length; i++)
{
d=f * buf[i];
if (d > 255) d = 255;
b8Buffer[i] = (byte)d;
}
PadPixel(b8Buffer);
Draw(upperLeft);
return true;
}
//显示图像
private void Draw(Point upperLeft)
{
FillBitmapData();
Graphics gFront = view.CreateGraphics();
gFront.DrawImage(bitmap, upperLeft);
gFront.Dispose();
}
private void CreatePalette(Bitmap bmp)
{
byte[] colorList;
#region 创建颜色表,共 256 种颜色,每个颜色为 4bytes,依次为
R(0-255),G(0-255),B(0-255),A(0-255)
colorList = new byte[256*4] {
// 常规灰度编码,饱和时为红色
0, 0, 0,255 , 1, 1, 1,255 , 2, 2, 2,255 , 3, 3, 3,255 , //4
4, 4, 4,255 , 5, 5, 5,255 , 6, 6, 6,255 , 7, 7, 7,255 , //8
8, 8, 8,255 , 9, 9, 9,255 , 10, 10, 10,255 , 11, 11, 11,255 , //12
12, 12, 12,255 , 13, 13, 13,255 , 14, 14, 14,255 , 15, 15, 15,255 , //16
16, 16, 16,255 , 17, 17, 17,255 , 18, 18, 18,255 , 19, 19, 19,255 , //20
20, 20, 20,255 , 21, 21, 21,255 , 22, 22, 22,255 , 23, 23, 23,255 , //24
24, 24, 24,255 , 25, 25, 25,255 , 26, 26, 26,255 , 27, 27, 27,255 , //28
28, 28, 28,255 , 29, 29, 29,255 , 30, 30, 30,255 , 31, 31, 31,255 , //32
32, 32, 32,255 , 33, 33, 33,255 , 34, 34, 34,255 , 35, 35, 35,255 , //36
36, 36, 36,255 , 37, 37, 37,255 , 38, 38, 38,255 , 39, 39, 39,255 , //40
40, 40, 40,255 , 41, 41, 41,255 , 42, 42, 42,255 , 43, 43, 43,255 , //44
44, 44, 44,255 , 45, 45, 45,255 , 46, 46, 46,255 , 47, 47, 47,255 , //48
48, 48, 48,255 , 49, 49, 49,255 , 50, 50, 50,255 , 51, 51, 51,255 , //52
52, 52, 52,255 , 53, 53, 53,255 , 54, 54, 54,255 , 55, 55, 55,255 , //56
56, 56, 56,255 , 57, 57, 57,255 , 58, 58, 58,255 , 59, 59, 59,255 , //60
60, 60, 60,255 , 61, 61, 61,255 , 62, 62, 62,255 , 63, 63, 63,255 , //64
64, 64, 64,255 , 65, 65, 65,255 , 66, 66, 66,255 , 67, 67, 67,255 , //68
68, 68, 68,255 , 69, 69, 69,255 , 70, 70, 70,255 , 71, 71, 71,255 , //72
72, 72, 72,255 , 73, 73, 73,255 , 74, 74, 74,255 , 75, 75, 75,255 , //76
76, 76, 76,255 , 77, 77, 77,255 , 78, 78, 78,255 , 79, 79, 79,255 , //80
80, 80, 80,255 , 81, 81, 81,255 , 82, 82, 82,255 , 83, 83, 83,255 , //84
84, 84, 84,255 , 85, 85, 85,255 , 86, 86, 86,255 , 87, 87, 87,255 , //88
88, 88, 88,255 , 89, 89, 89,255 , 90, 90, 90,255 , 91, 91, 91,255 , //92
92, 92, 92,255 , 93, 93, 93,255 , 94, 94, 94,255 , 95, 95, 95,255 , //96
96, 96, 96,255 , 97, 97, 97,255 , 98, 98, 98,255 , 99, 99, 99,255 , //100
100,100,100,255 , 101,101,101,255 , 102,102,102,255 , 103,103,103,255 , //104
104,104,104,255 , 105,105,105,255 , 106,106,106,255 , 107,107,107,255 , //108
108,108,108,255 , 109,109,109,255 , 110,110,110,255 , 111,111,111,255 , //112
112,112,112,255 , 113,113,113,255 , 114,114,114,255 , 115,115,115,255 , //116
116,116,116,255 , 117,117,117,255 , 118,118,118,255 , 119,119,119,255 , //120
120,120,120,255 , 121,121,121,255 , 122,122,122,255 , 123,123,123,255 , //124
124,124,124,255 , 125,125,125,255 , 126,126,126,255 , 127,127,127,255 , //128
128,128,128,255 , 129,129,129,255 , 130,130,130,255 , 131,131,131,255 , //132
132,132,132,255 , 133,133,133,255 , 134,134,134,255 , 135,135,135,255 , //136
136,136,136,255 , 137,137,137,255 , 138,138,138,255 , 139,139,139,255 , //140
140,140,140,255 , 141,141,141,255 , 142,142,142,255 , 143,143,143,255 , //144
144,144,144,255 , 145,145,145,255 , 146,146,146,255 , 147,147,147,255 , //148
148,148,148,255 , 149,149,149,255 , 150,150,150,255 , 151,151,151,255 , //152
152,152,152,255 , 153,153,153,255 , 154,154,154,255 , 155,155,155,255 , //156
156,156,156,255 , 157,157,157,255 , 158,158,158,255 , 159,159,159,255 , //160
160,160,160,255 , 161,161,161,255 , 162,162,162,255 , 163,163,163,255 , //164
164,164,164,255 , 165,165,165,255 , 166,166,166,255 , 167,167,167,255 , //168
168,168,168,255 , 169,169,169,255 , 170,170,170,255 , 171,171,171,255 , //172
172,172,172,255 , 173,173,173,255 , 174,174,174,255 , 175,175,175,255 , //176
176,176,176,255 , 177,177,177,255 , 178,178,178,255 , 179,179,179,255 , //180
180,180,180,255 , 181,181,181,255 , 182,182,182,255 , 183,183,183,255 , //184
184,184,184,255 , 185,185,185,255 , 186,186,186,255 , 187,187,187,255 , //188
188,188,188,255 , 189,189,189,255 , 190,190,190,255 , 191,191,191,255 , //192
192,192,192,255 , 193,193,193,255 , 194,194,194,255 , 195,195,195,255 , //196
196,196,196,255 , 197,197,197,255 , 198,198,198,255 , 199,199,199,255 , //200
200,200,200,255 , 201,201,201,255 , 202,202,202,255 , 203,203,203,255 , //204
204,204,204,255 , 205,205,205,255 , 206,206,206,255 , 207,207,207,255 , //208
208,208,208,255 , 209,209,209,255 , 210,210,210,255 , 211,211,211,255 , //212
212,212,212,255 , 213,213,213,255 , 214,214,214,255 , 215,215,215,255 , //216
216,216,216,255 , 217,217,217,255 , 218,218,218,255 , 219,219,219,255 , //220
220,220,220,255 , 221,221,221,255 , 222,222,222,255 , 223,223,223,255 , //224
224,224,224,255 , 225,225,225,255 , 226,226,226,255 , 227,227,227,255 , //228
228,228,228,255 , 229,229,229,255 , 230,230,230,255 , 231,231,231,255 , //232
232,232,232,255 , 233,233,233,255 , 234,234,234,255 , 235,235,235,255 , //236
236,236,236,255 , 237,237,237,255 , 238,238,238,255 , 239,239,239,255 , //240
评论1