当前位置: 首页 > 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.jsqmd.com/news/38241/

相关文章:

  • 使用docker安装配置 elasticsearch + kibana
  • Magento API文件上传漏洞导致远程代码执行分析
  • Unity实现两种图片马赛克效果
  • winform播放声音文件,播完成后自动播放下一个文件
  • 基于OFDM数据符号的多普勒频率估计与移动台速度提取方法
  • 雷池 WAF 免费版实测:小白用 Apache 搭环境,30 分钟护住 API 接口安全
  • opentelemetry全链路初探--python注入
  • 三石量化股票数据提取分析报告 - 2025年11月12日
  • 2025年运动鞋旋转扣定做厂家权威推荐榜单:鞋带导扣/快速系带旋转扣/便携旋转扣源头厂家精选
  • 2025年EGUOO诺贝尔科学家:深度解析科研赋能膳食营养的范式与边界
  • 卷积层属于输入层、输出层还是隐藏层
  • 开源方案RuoYi-Cloud-Plus详解——公网内网穿透到虚拟机环境(持续更新)
  • Elasticsearch 集群为所有分片(主分片和副本分片)进行分配,恢复正常分片调度行为
  • 2025年EGUOO男士三氨能量:深度解析氨基酸配方的男性健康逻辑
  • Pyodide 环境
  • 东方财富股票数据提取分析报告 - 2025年11月12日 - 10:49:33
  • 2025年高品质Z型斗式提升机厂家权威推荐榜单:耐用的Z型斗式提升机/正规的Z型斗式提升机/诚信的Z型斗式提升机源头厂家精选
  • 2025年EGUOO纳豆激酶功效:权威盘点心血管养护的科学边界与实证
  • NGINX Docker 镜像使用指南
  • Machine Learning - SVM
  • 2025年11月港股打新券商推荐:牌照合规性与服务实力综合评测排行榜
  • 智能呼叫中心系统测评推荐:从高并发处理到AI能力,深度剖析5大品牌的实战能力
  • 2025年EGUOO美国原装进口深度解析:本土研发到全球交付的全程品控链
  • 2025年EGUOO纳豆激酶:深度解析心血管膳食补充剂科研链路与市场真实表现
  • 2025年EGUOO纳豆激酶:深度解析心血管膳食补充剂的科研护城河
  • Skp版本转换器 支持 SketchUp3-2025(中文免费版)下载与安装教程
  • 常用设计模式:代理模式
  • 2025年山东直流电机维修公司权威推荐榜单:主轴电机维修/永磁电机维修/大型电机维修服务商精选
  • AI元人文:价值原语化——构建从个体到文明的协同元代码
  • 神经元为什么要设置偏置bias