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

C# 通过共享内存的方式给python传递一张图片

C# 通过共享内存的方式给Python传递一张图片

简介: 需求是需要传到python中一张图片,然后通过python进行处理,我想到了一种进程间通信的方法,共享内存,我的理解就是开辟一块内存,A向内存里面写数据,B再去读取这块内存的数据。

C# 主程序代码

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Text;
using System.Diagnostics;
using HalconDotNet;class Program
{static void Main(){// 共享内存名称string sharedMemoryName = "TestSharedMemory";HImage hImage = new HImage(@"F:\test1.bmp");// 要传递的数据string message = "Hello from C#! 这是来自C#的消息。";int number = 12345;double value = 3.14159;Console.WriteLine("C#程序启动...");Console.WriteLine($"要发送的消息: {message}");Console.WriteLine($"要发送的整数: {number}");Console.WriteLine($"要发送的浮点数: {value}");// 创建共享内存using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(sharedMemoryName, 1024))using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor()){// 写入字符串byte[] messageBytes = Encoding.UTF8.GetBytes(message);accessor.Write(0, messageBytes.Length); // 在位置0写入字符串长度accessor.WriteArray(4, messageBytes, 0, messageBytes.Length); // 从位置4开始写入字符串// 写入整数(位置100)accessor.Write(100, number);// 写入浮点数(位置104)accessor.Write(104, value);// 写入完成标志(位置112)accessor.Write(112, 1);Console.WriteLine("\n数据已写入共享内存!");// 启动Python程序StartPythonProgram();Console.WriteLine("按任意键退出...");Console.ReadKey();}}static void StartPythonProgram(){try{// 获取当前目录string currentDir = Directory.GetCurrentDirectory();string pythonScriptPath = @"C:\Users\Administrator\Desktop\pythonProject3\main.py";Console.WriteLine($"正在启动Python脚本: {pythonScriptPath}");ProcessStartInfo start = new ProcessStartInfo();start.FileName = "python";start.Arguments = $"\"{pythonScriptPath}\"";start.UseShellExecute = false;start.RedirectStandardOutput = true;start.RedirectStandardError = true;start.CreateNoWindow = true;int index = 1;while(true){using (Process process = Process.Start(start)){// 读取Python输出string output = process.StandardOutput.ReadToEnd();string error = process.StandardError.ReadToEnd();process.WaitForExit();if (!string.IsNullOrEmpty(output))Console.WriteLine($"Python输出:\n{output}");if (!string.IsNullOrEmpty(error))Console.WriteLine($"Python错误:\n{error}");}}}catch (Exception ex){Console.WriteLine($"启动Python程序失败: {ex.Message}");Console.WriteLine("请确保Python已安装并在PATH环境变量中");}}
}

C# 代码

using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using HalconDotNet;public class SharedMemorySender
{public unsafe void SendHObject(HObject image, string mapName = "HalconImageSharedMem"){MemoryMappedFile mmf = null;MemoryMappedViewAccessor accessor = null;try{// 获取图像指针和基本信息HOperatorSet.GetImagePointer1(image, out HTuple pointer, out HTuple type, out HTuple width, out HTuple height);// 计算图像数据大小int pixelSize = GetPixelSize(type);int imageDataSize = width.I * height.I * pixelSize;// 创建内存映射文件 (大小 = 图像数据 + 4个int头部信息)int headerSize = sizeof(int) * 4;int totalSize = headerSize + imageDataSize;mmf = MemoryMappedFile.CreateNew(mapName, totalSize);// 获取访问器并写入头部信息accessor = mmf.CreateViewAccessor();int offset = 0;// 明确指定类型accessor.Write(offset, width.I);offset += sizeof(int);accessor.Write(offset, height.I);offset += sizeof(int);accessor.Write(offset, pixelSize);offset += sizeof(int);// 将类型字符串转换为整数编码int typeCode = GetTypeCode(type.S);accessor.Write(offset, typeCode);offset += sizeof(int);// 将图像数据拷贝到共享内存 - 使用不安全上下文byte* source = (byte*)pointer.L;for (int i = 0; i < imageDataSize; i++){accessor.Write(offset + i, source[i]);}Console.WriteLine($"图像已写入共享内存: {width}x{height}, 类型: {type}, 大小: {imageDataSize}字节");Console.WriteLine("按任意键退出...");Console.ReadKey();}finally{accessor?.Dispose();mmf?.Dispose();}}private int GetPixelSize(HTuple imageType){switch (imageType.S){case "byte": return 1;case "uint2": return 2;case "int4": return 4;default: throw new ArgumentException($"不支持的图像类型: {imageType}");}}private int GetTypeCode(string typeString){switch (typeString){case "byte": return 1;case "uint2": return 2;case "int4": return 4;default: return 1; // 默认byte}}
}

Python代码

import mmap
import structindex = 1def read_shared_memory():try:print("Python程序启动...")print("正在读取共享内存...")# 打开共享内存# 注意:在Windows上使用命名共享内存,在Linux上使用文件映射mm = mmap.mmap(-1, 1024, tagname='TestSharedMemory', access=mmap.ACCESS_READ)# 读取字符串长度(4字节整数)str_length_bytes = mm.read(4)str_length = struct.unpack('I', str_length_bytes)[0]  # 'I' 表示无符号整数# 读取字符串内容string_data = mm.read(str_length).decode('utf-8')# 跳转到整数位置(100)mm.seek(100)number_data = struct.unpack('i', mm.read(4))[0]  # 'i' 表示有符号整数# 读取浮点数(104)mm.seek(104)value_data = struct.unpack('d', mm.read(8))[0]  # 'd' 表示双精度浮点数# 读取完成标志(112)mm.seek(112)flag = struct.unpack('i', mm.read(4))[0]mm.close()print("\n从C#程序接收到的数据:")print(f"字符串: {string_data}")print(f"整数: {number_data}")print(f"浮点数: {value_data}")print(f"完成标志: {flag}")# 返回成功信息return "Python程序执行成功!"except Exception as e:error_msg = f"读取共享内存失败: {str(e)}"print(error_msg)return error_msgdef main():# 你的主要逻辑return "==" + str(index)if __name__ == "__main__":# result = read_shared_memory()# print(f"\n执行结果: {result}")index = index + 1exit(main())
http://www.gsyq.cn/news/47252.html

相关文章:

  • 雷池 WAF 免费版实测:小白用 Apache 搭环境,30 分钟护住 API 接口安全
  • 三石量化股票数据提取分析报告 - 2025年11月12日
  • 2025年运动鞋旋转扣定做厂家权威推荐榜单:鞋带导扣/快速系带旋转扣/便携旋转扣源头厂家精选
  • 卷积层属于输入层、输出层还是隐藏层
  • 东方财富股票数据提取分析报告 - 2025年11月12日 - 10:49:33
  • 2025年EGUOO纳豆激酶功效:权威盘点心血管养护的科学边界与实证
  • 2025年11月港股打新券商推荐:牌照合规性与服务实力综合评测排行榜
  • 2025年EGUOO美国原装进口深度解析:本土研发到全球交付的全程品控链
  • 2025年EGUOO纳豆激酶:深度解析心血管膳食补充剂的科研护城河
  • Pyodide WebAssembly环境
  • Skp版本转换器 支持 SketchUp3-2025(中文免费版)下载与安装教程
  • 2025年山东直流电机维修公司权威推荐榜单:主轴电机维修/永磁电机维修/大型电机维修服务商精选
  • 神经元为什么要设置偏置bias
  • 2025 年 11 月柏尔地板厂家推荐排行榜,定制地板,实木地板,高端定制,实木地热,实木双锁扣地板公司精选
  • 2025 年 11 月悬浮炉厂家推荐排行榜,真空悬浮炉,真空感应悬浮炉,50kg悬浮炉,30kg悬浮炉,15kg悬浮炉,5kg悬浮炉公司精选
  • 2025年高端员工工作服定做厂家权威推荐榜单:高端工服/高端劳保工作服/高端夏季工作服源头厂家精选
  • 2025CSP-S组 T2 部分分做法
  • 实现文件外发管控怎么做的全面指南
  • VonaJS: I18n如何支持Swagger多语言
  • 2025年环氧防腐底漆生产厂家权威推荐榜单:水性有机硅/水性聚氨酯漆/双组份水性漆源头厂家精选
  • 跨网文件传输怎么做?主要有哪几种安全有效的解决方案?
  • 2025企业选择什么样的IT监控厂商?数字化转型值得部署的5款运维监控产品推荐
  • springboot 使用druid 配置数据库密码加密
  • 迈威IMC系列光纤收发器为何成为市场“真香”选择?
  • 2025年EGUOO肠胃片成分权威解析:四维科学矩阵如何重塑肠胃养护范式
  • 【汇总】VS Code Windows 快捷键 (三列中英文对照)
  • 数字写作工具观察:Markdown编辑器的本地化新选择
  • 2025年EGUOO护肝片深度解析:科研矩阵下的成分协同与代谢干预
  • 2025年11月无线表面肌电生产厂家与品牌推荐:谁才是行业翘楚?
  • 2025年EGUOO关节营养素:深度解析复合配方与实证功效