GenImageConverter.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Drawing;
  3. using System.Runtime.InteropServices;
  4. using Cognex.VisionPro;
  5. using TeamAAS.Camera.Images;
  6. namespace Plugins.Vpp.Converters
  7. {
  8. /// <summary>
  9. /// GenImage ↔ VisionPro ICogImage 双向转换器。
  10. /// 用于 Plugins.Vpp 中把通用图像类转换为 VisionPro 图像类型供 ToolBlock/AcqFifo 使用。
  11. /// </summary>
  12. public static class GenImageConverter
  13. {
  14. /// <summary>
  15. /// GenImage → ICogImage(供 VisionPro 工具使用)。
  16. /// Grey8 → CogImage8Grey,彩色 → CogImage24PlanarColor。
  17. /// </summary>
  18. public static ICogImage ToCogImage(GenImage img)
  19. {
  20. if (img == null) return null;
  21. try
  22. {
  23. if (img.Format == PixelType.Grey8)
  24. {
  25. return Grey8ToCogImage(img);
  26. }
  27. // 彩色或 Grey16 → 通过 Bitmap 中转
  28. using (var bmp = img.ToBitmap())
  29. {
  30. if (img.Format == PixelType.Grey8 || img.Format == PixelType.Grey16)
  31. {
  32. var grey = new CogImage8Grey(bmp);
  33. return grey;
  34. }
  35. var color = new CogImage24PlanarColor(bmp);
  36. return color;
  37. }
  38. }
  39. catch
  40. {
  41. return null;
  42. }
  43. }
  44. /// <summary>
  45. /// ICogImage → GenImage(从 VisionPro 采集结果转换为通用图像)。
  46. /// </summary>
  47. public static GenImage FromCogImage(ICogImage cogImage)
  48. {
  49. if (cogImage == null) return null;
  50. try
  51. {
  52. using (var bmp = cogImage.ToBitmap())
  53. {
  54. return GenImage.FromBitmap(bmp);
  55. }
  56. }
  57. catch
  58. {
  59. return null;
  60. }
  61. }
  62. private static ICogImage Grey8ToCogImage(GenImage img)
  63. {
  64. // 通过 Bitmap 中转:CogImage8Grey(Bitmap) 会把像素【拷贝】进 VisionPro 自有内存。
  65. // 历史教训:直接 CogImage8Root.Initialize 包裹 GenImage.Data 的托管数组 + 立即解除固定,
  66. // GC 挪动/回收数组后 CogImage 读到悬空指针 → 显示全黑、工具结果恒为 0(本机实测复现)。
  67. // (CogImage8Grey 没有 SetRootCopier/Freeze 可用,Bitmap 路径是确定正确的拷贝方式。)
  68. using (var bmp = img.ToBitmap())
  69. {
  70. return new CogImage8Grey(bmp);
  71. }
  72. }
  73. }
  74. }