| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- using System;
- using System.Drawing;
- using System.Runtime.InteropServices;
- using Cognex.VisionPro;
- using TeamAAS.Camera.Images;
- namespace Plugins.Vpp.Converters
- {
- /// <summary>
- /// GenImage ↔ VisionPro ICogImage 双向转换器。
- /// 用于 Plugins.Vpp 中把通用图像类转换为 VisionPro 图像类型供 ToolBlock/AcqFifo 使用。
- /// </summary>
- public static class GenImageConverter
- {
- /// <summary>
- /// GenImage → ICogImage(供 VisionPro 工具使用)。
- /// Grey8 → CogImage8Grey,彩色 → CogImage24PlanarColor。
- /// </summary>
- public static ICogImage ToCogImage(GenImage img)
- {
- if (img == null) return null;
- try
- {
- if (img.Format == PixelType.Grey8)
- {
- return Grey8ToCogImage(img);
- }
- // 彩色或 Grey16 → 通过 Bitmap 中转
- using (var bmp = img.ToBitmap())
- {
- if (img.Format == PixelType.Grey8 || img.Format == PixelType.Grey16)
- {
- var grey = new CogImage8Grey(bmp);
- return grey;
- }
- var color = new CogImage24PlanarColor(bmp);
- return color;
- }
- }
- catch
- {
- return null;
- }
- }
- /// <summary>
- /// ICogImage → GenImage(从 VisionPro 采集结果转换为通用图像)。
- /// </summary>
- public static GenImage FromCogImage(ICogImage cogImage)
- {
- if (cogImage == null) return null;
- try
- {
- using (var bmp = cogImage.ToBitmap())
- {
- return GenImage.FromBitmap(bmp);
- }
- }
- catch
- {
- return null;
- }
- }
- private static ICogImage Grey8ToCogImage(GenImage img)
- {
- // 通过 Bitmap 中转:CogImage8Grey(Bitmap) 会把像素【拷贝】进 VisionPro 自有内存。
- // 历史教训:直接 CogImage8Root.Initialize 包裹 GenImage.Data 的托管数组 + 立即解除固定,
- // GC 挪动/回收数组后 CogImage 读到悬空指针 → 显示全黑、工具结果恒为 0(本机实测复现)。
- // (CogImage8Grey 没有 SetRootCopier/Freeze 可用,Bitmap 路径是确定正确的拷贝方式。)
- using (var bmp = img.ToBitmap())
- {
- return new CogImage8Grey(bmp);
- }
- }
- }
- }
|