提醒:
在从 C++获取, 相机获取等等其它方式 得到的可能是 一维的图片buffer
在显示时 存在 转换格式复杂、转换速度(GetPixel())慢等情况。
经过测试一个奇怪的情况:
图片格式 Bitmap Format32bppArgb:格式 32位 ARGB 格式
图片缓存排列顺序居然是 BGRA方式排列的
其它格式 需要各位自己测试
与C++ opencv BGRA 的排列方式一致。
因此 可以直接拷贝内存数据, 速度很快(不需要循环、不需要排列方式调整)
具体代码如下:
定义的结构体
public struct ImageInfo
{
public int width; //图片宽度;
public int height; //图片高度;
public int nBandNum; //像素大小;
};
图片基本设置
ImageInfo imageInfo = new ImageInfo();
imageInfo.width = 953;
imageInfo.height = 787;
imageInfo.nBandNum =4;
int imageSize = imageInfo.width * imageInfo.height * 4;
byte[] srcImageBuffer = new byte[imageSize];
//注意 获取数据
for (int k = 0; k < (953 * 787 * 4); k += 4)
{
double kk = (double)k;
results[k + 3] = results[k + 2] = results[k+1] = (byte)(((kk + 1.0) / (953 * 787 * 4.0)) * 255.0);
results[k] = 255;
}
创建图片 拷贝并显示
// 图片对象
// 设置图片宽度与高度 图片格式:Format32bppArgb:32位 ARGB格式
Bitmap bmp = new Bitmap(imageInfo.width, imageInfo.height, PixelFormat.Format32bppArgb);
// 锁定图片内存区域
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, imageInfo.width, imageInfo.height), // 锁定范围
ImageLockMode.WriteOnly, //只读方式
PixelFormat.Format32bppArgb); // 图片格式
// 锁定图片内存地址
IntPtr iptr = bmpData.Scan0;
// 拷贝图片内存地址
System.Runtime.InteropServices.Marshal.Copy(
srcImageBuffer, // 拷贝图片数据源 注意:32位 ARGB数据的排列顺序是 BGRA
0, // 起始索引
iptr, // 目标地址
imageSize); // 图片大小
// 解锁图片内存
bmp.UnlockBits(bmpData);
// 显示图片
this.pictureBox1.Image = bmp;
this.pictureBox1.Show();