当前位置: 首页 > news >正文

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。

 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数组携带的数据信息

相关文章:

  • 高露洁牙膏是哪个国家的品牌?高露洁牙膏哪一款最好?
  • 内置类型成员变量的初始化详解
  • 【基础算法】二分查找的多种写法
  • rabbitMQ如何确保消息不会丢失
  • Qt通过QXlsx库文件写入到excl文件,读取excl文件
  • 解决The‘InnoDB’feature is disabled; you need MySQL built with ‘InnoDB’ to have it
  • 计算几何(简单旋转卡壳)2024昆明邀请赛
  • Expected SARSA算法详解:python 从零实现
  • 仿腾讯会议——注册登录实现
  • Day.js和Moment.js对比,日期时间库怎么选?
  • SALOME源码分析: ParaVis
  • 【连载9】基础智能体的进展与挑战综述-行动系统
  • 基于STM32的带恒温系统智能外卖柜设计
  • B站Michale_ee——ESP32_IDF SDK——FreeRTOS_5 事件组同步与等待
  • 如何让模型聪明地选择特征:一种“蒸馏及选择”的方法
  • 使用 Tesseract 实现藏文OCR
  • 大数据面试问答-数据湖
  • Codex CLI轻量级 AI 编程智能体 :openai又放大招了
  • 正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真
  • 在pycharm profession 2020.3上安装使用xlwings
  • 哈马斯:愿与以色列达成为期5年的停火协议
  • 17家A股城商行一季报扫描:青岛银行营收增速领跑,杭州银行净利增速领跑
  • 新势力4月销量出炉:零跑逾4万辆再夺冠,蔚来环比增近六成,小米下滑
  • 涉嫌严重违纪违法,57岁证监会副主席王建军被查
  • 中国证券监督管理委员会党委委员、副主席王建军接受审查调查
  • 抗美援朝老战士宁昭逝世,享年93岁