C#将Mat或Byte快速转换为Bitmap格式

前言

在用VisionMaster时候,由于所有的图像参数都是由Bitmap或者海康自有的格式作为传参的。但是在封装VisionMaster的算子时候,因为要适配原有的框架和数据结构,所以必须有一个可以从现有格式转换为Bitmap格式。一般来说Bitmap格式都是从Byte数组中转换而来的。

现有的软件框架图像都是用OpenCV实现的,所以就需要从OpenCV转换为Byte数组再转换为Bitmap格式。但是我再编写VisionMaster的条码检测二次开发时,我发现条码一直识别不上,后面我才发现原来是一个伪彩图。

一.正确方式

现在暂时先开发了现在我封装的代码库,暂时局限于8位灰度格式。所以暂时只适配了8位灰度格式。

1.将Bitmap的调色板进行静态化,那么再重新每次运行时候就不需要重复的对Bitmap进行生成调色板,可以节约大量的时间,当然也可以作为软件启动的预加载项,加载调色板大概需要10ms的时间。

2.实际的运行速度

在测试1000*800大小的Mat8UC1格式,转换为Bitmap格式约为5ms。

csharp 复制代码
 private static ColorPalette? palette;
 /// <summary>
 /// 8位灰度Mat转8位灰度Bitmap
 /// </summary>
 /// <param name="mat"></param>
 /// <returns></returns>
 public static Bitmap ConvertMatToBitmap(Mat mat,PixelFormat format)
 {
     if (format== PixelFormat.Format8bppIndexed)
     {
         if (palette == null)
         {
             palette = new Bitmap(1, 1, PixelFormat.Format8bppIndexed).Palette;
             for (int i = 0; i < 256; i++)
             {
                 palette.Entries[i] = Color.FromArgb(i, i, i);
             }
         }

         byte[] encodedBytes1;
         Cv2.ImEncode(".bmp", mat, out encodedBytes1);
         // 创建 8 位索引的 Bitmap 对象
         Bitmap bitmap = new Bitmap(mat.Width, mat.Height, PixelFormat.Format8bppIndexed);
         bitmap.Palette = palette;
         // 锁定 Bitmap 数据
         BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, mat.Width, mat.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
         try
         {
             // 跳过文件头(14 字节)、信息头(40 字节)和调色板(256*4=1024 字节)
             Marshal.Copy(encodedBytes1, 1078, bitmapData.Scan0, encodedBytes1.Length - 1078);
         }
         finally
         {
             // 解锁 Bitmap 数据
             bitmap.UnlockBits(bitmapData);
         }
         return bitmap;
     }
     return null;
     
 }

注意事项

从Mat转换为Byte格式时候,由于我们会使用无损压缩的BMP格式。BMP格式数组会根据实际情况携带文件头信息14字节,信息头40字节,和调色板(颜色数量*4(BGRX调色板))。所以我们在访问数据信息时需要先剔除Byte数组携带的数据信息

相关推荐
NEGl DRYN4 分钟前
Go基础之环境搭建
开发语言·后端·golang
AI木马人6 分钟前
20.人工智能实战:大模型项目如何从 Demo 走向生产?一套可落地的上线验收清单与工程治理方案
java·开发语言·人工智能
CandyU27 分钟前
Unity —— 反射
java·开发语言
初心未改HD9 分钟前
Go Modules:依赖管理的完全指南
开发语言·golang
楼田莉子9 分钟前
仿照Muduo的高并发服务器:EventLoop模块及与TimeWheel模块联调
java·开发语言
小雅痞11 分钟前
[Java][Leetcode middle] 3. 无重复字符的最长子串
java·开发语言·leetcode
逻辑驱动的ken22 分钟前
Java高频面试考点场景题21
java·开发语言·面试·职场和发展·求职招聘
rOuN STAT29 分钟前
Golang 构建学习
开发语言·学习·golang
fengxin_rou33 分钟前
黑马点评项目万字总结:从redis基础到实战应用详解
java·开发语言·分布式·后端·黑马点评
zhouwy11334 分钟前
Golang 基础与实战笔记:从语法到微服务的全面指南
开发语言·go