底层相机采集模块使用C++编写,需要传递给上层UI(C#)显示,即将非托管内存转换为Bitmap:

C#与C++接口图像表示:

/// <summary>
/// 底层图像表示
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct ImageParam
{public int Width;               //图像宽public int Height;              //图像高public int Depth;               //图像一行位深,8、16、24、32public int Step;                //图像一行byte数public IntPtr ImagePtr;         //图像数据指针
}

C#端转换代码:

[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
private static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);/// <summary>
/// ImageParam转Bitmap
/// </summary>
/// <param name="imageParam"></param>
/// <returns></returns>
public static Bitmap Convert(ImageParam imageParam)
{// 指针是否为空if (IntPtr.Zero == imageParam.ImagePtr){return null;}try{// 像素类型,8位或24位,其他自行添加PixelFormat pf = 8 == imageParam.Depth ? PixelFormat.Format8bppIndexed : PixelFormat.Format24bppRgb;Bitmap image = new Bitmap(imageParam.Width, imageParam.Height, pf);// 拷贝图像数据for (int i = 0; i < imageParam.Height; ++i){Rectangle roi = new Rectangle(0, i, imageParam.Width, 1);BitmapData bd = image.LockBits(roi, ImageLockMode.ReadWrite, image.PixelFormat);CopyMemory(bd.Scan0, imageParam.ImagePtr + imageParam.Step * i, (uint)(imageParam.Step));image.UnlockBits(bd);}// 8位要创建调色板if (8 == imageParam.Depth){var palette = image.Palette;for (int i = 0; i < palette.Entries.Length; ++i){palette.Entries[i] = Color.FromArgb(i, i, i);}image.Palette = palette;}return image;}catch (Exception){return null;}
}

非托管内存转换为System.Drawing.Bitmap相关推荐

  1. c# image转换为bitmap,C# - 转换WPF Image.source到System.Drawing.Bitmap

    I've found loads of people converting BitmapSources to Bitmaps, but what about ImageSources to Bitma ...

  2. C# 托管内存与非托管内存之间的转换

    C# 托管内存与非托管内存之间的转换 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我 ...

  3. 转 C# 托管内存与非托管内存之间的转换

    1.c#的托管代码和非托管代码 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作 ...

  4. 记一次 .NET 某智慧水厂API 非托管内存泄漏分析

    一:背景 1. 讲故事 七月底的时候有位朋友在wx上找到我,说他的程序内存占用8G,托管才占用1.5G,询问剩下的内存哪里去了?截图如下: 从求助内容看,这位朋友真的太客气了,动不动就谈钱,真伤感情, ...

  5. C# 使用System.Drawing.Bitmap报错

    C#使用System.Drawing.Bitmap时报错 最近创建c#项目,使用System.Drawing.Bitmap时报错如下: CS1069 未能在命名空间"System.Drawi ...

  6. Unity 使用Marshal类将托管内存封送到非托管内存

    C++代码通常被称为非托管代码,而我们在Unity中使用的C#代码会被编译成通用中间语言CIL,CIL/.Net代码通常被称为托管代码.那我们如何在Unity中调用由C++封装的dll动态库中接口时将 ...

  7. 让System.Drawing.Bitmap可以在linux运行

    .net core的bitmap使用的是以下类库,但无法在linux运行 https://github.com/CoreCompat/CoreCompat 在linux运行需要安装runtime.li ...

  8. C#遇到System.Drawing.Bitmap有问题

    C#处理bitmap数据时,遇到 error CS0246: 未能找到类型或命名空间名"Bitmap"(是否缺少 using 指令或程序集引用?) 貌似是因为缺少 System.D ...

  9. 记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析

    更多高质量干货:参见我的 GitHub: dotnetfly 一:背景 1. 讲故事 说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我. 无数次的听说用 Unity 可做 ...

最新文章

  1. POJ 3034 Whac-a-Mole [DP]
  2. 数据结构---模式匹配
  3. react实现路由跳转_react实现hash路由
  4. linux 管道 top,linux IPC总结——管道
  5. IIS6 mysql速度_Win 2003下IIS6+Mysql+php5.2  isapi搭建 升级php5.2到5.3测试 借助fastcgi实现...
  6. Java微信公众号开发
  7. 数据分析师面试题目_数据分析师面试|新公布的大数据分析师面试题,这个细节值得被注意...
  8. 汇总病毒样本的常用反调试技术、反分析技巧(持续更新)
  9. okhttp3调用接口超时
  10. 中国世界500强数量首超美国,但别高兴得太早
  11. # 二阶混合偏导(Second-order mixed derivatives)
  12. NVIDIA CUDA初级教程(P2-P3)CPU体系架构概述、并行程序设计概述
  13. javascript 判断 flash 插件是否安装
  14. 赋能 打造应对不确定性的敏捷团队 pdf_协会成长课堂|《赋能》:打造应对不确定性的敏捷团队...
  15. git上传代码和下载代码
  16. Visio取消显示两直线之间的跨线
  17. POJO和PO的概念,区别
  18. 浅谈Linux PCI设备驱动(一)
  19. 控件用法-WdatePicker 隐藏各按钮
  20. Tensorrt 7.2.3 转换yolov5 v3.0 pytorch1.8.1 onnx1.6.0

热门文章

  1. java object 是否为null,java – 为什么cast(Object)null结果为null?
  2. 【vue.js】+云存储(实现图片上传功能)
  3. 董路太有才了--春晚零点报时出错技术分析
  4. 计算机u盘设备无法启动不了怎么办,u盘无法启动提示错误代码10该怎么处理
  5. FigDraw 13. SCI 文章绘图之桑葚图及文章复现(Sankey)
  6. type是python保留字_Python保留字总结
  7. Java趣味编程(二)
  8. Python tkinter 保姆级超简易登陆界面教学
  9. 篇4:xShell连接ubuntu不成功
  10. 什么是嵌入式服务器?为什么要使用嵌入式服务器? -- java面试