C# 图片快速拷贝

提醒:
在从 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();

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45875105/article/details/111664627