Python 与 Qt c++ 程序共享内存,传递图片

python 代码

这里Python 使用 shared_memory
QT 使用 QSharedMemory

简单协议:
前面4个字节是 图片with,height,0,0
后面是图片数据

import sys
import struct
def is_little_endian():x=0x12345678y = struct.pack('I',x)return y[0]==0x78print(f"is_little_endian:{is_little_endian()}")from multiprocessing import  shared_memory
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt# 随机颜色 RGBA
def random_color()->tuple:rgba = np.random.randint(0,255,size=4)return tuple(rgba)# 用随机数填充像素
def fill_random_pixels(img):width, height = img.sizefor x in range(width):for y in range(height):img.putpixel((x, y), random_color())if __name__ == "__main__":# 选择随机图片或者加载本地图片 random_image=Falseimg_width = 100img_height = 100img = Image.new('RGBA', (img_width, img_height))if random_image:fill_random_pixels(img)origin_data = np.array(img)else:img_path = "C:\\Users\\mingxingwang\\Pictures\\qt-logo.png"# 打开图片并转换为numpy数组img = Image.open(fp=img_path)img = img.convert("RGBA")print(f"------------img.size------------:\n{img.size}\n")img_width,img_height = img.sizeorigin_data = np.array(img)origin_data = np.insert(origin_data,0,[img_width,img_height,0,0])print(f"------------img------------:\n{img}\n")print(f"------------origin_data------------:\n{origin_data}\n")print(f"------------origin_data.dtype------------:\n{origin_data.dtype}\n")#------------- 数据写入共享内存# 创建共享内存对象shm_a = shared_memory.SharedMemory(create=True, name="my_share_mem",size=origin_data.nbytes)#构造关联共享内存的数组mem_array = np.ndarray(origin_data.shape, dtype=origin_data.dtype, buffer=shm_a.buf)#copy 数据到共享内存mem_array[:]=origin_data[:]print(f"------------mem_array------------:\n{mem_array}\n")#显示原始图片origin_image = Image.frombytes(mode='RGBA',size=img.size,data=origin_data)plt.imshow(origin_image)plt.show()#------------- 共享内存获取数据existing_shm = shared_memory.SharedMemory(name='my_share_mem')array_from_mem = np.ndarray(origin_data.shape, dtype=origin_data.dtype, buffer=existing_shm.buf)print(f"------------array_from_mem------------:\n{array_from_mem}\n")##从共享内存构造图片img_from_mem = Image.frombytes(mode='RGBA',size=img.size,data=array_from_mem)##显示从共享内存获取的图片plt.imshow(img_from_mem)plt.show()shm_a.close()shm_a.unlink()

QT 程序

#include <QDebug>#include <QSharedMemory>
#include <QBuffer>
QSharedMemory *sm;sm = new QSharedMemory();// sm->setKey("my_share_mem");/// 与非Qt 程序通信 setNativeKeysm->setNativeKey("my_share_mem");if(!sm->attach()){qDebug()<<"attach error";return;}qDebug() << "attach success";QBuffer buffer;QImage image;sm->lock();buffer.setData((char*)sm->data(),sm->size());sm->unlock();sm->detach();if(!buffer.open(QBuffer::ReadOnly)){qDebug()<<"open buffer error";return;}// 按照传输协议,获取图片信息quint8 img_width , img_height ,other = 0;buffer.read((char*)&img_width,1);buffer.read((char*)&img_height,1);buffer.read((char*)&other,1);buffer.read((char*)&other,1);qDebug()<<"img_width:"<<img_width<<"img_height:"<<img_height<<"other:"<<other;// image bytes = width*height*4 (RGBA8888)uint len = img_width*img_height*4;uchar *p=(uchar*)buffer.data().data();printf("buffer[0]=%d,buffer[1]=%d,buffer[2]=%d,buffer[3]=%d \n",p[0],p[1],p[2],p[3]);fflush(stdout);//按照协议,从缓冲区构造图片image = QImage((uchar*)(p+4),img_width,img_height,QImage::Format_RGBA8888);qDebug()<<image;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试/测试开发丨利用人工智能ChatGPT自动生成PPT

点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中&#xff0c;无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT&#xff0c;协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等&#xff0c;可以给到观众更好…

css有用的小技巧(vue2)

1、希望悬浮的时候&#xff0c;img图标的src改变 <template><div style"padding: 20px"><img src"../static/icon/1.svg"></div> </template> <style scoped>img:hover {content: url(../static/icon/2.svg);} </…

第一百五十四回 如何实现滑动菜单

文章目录 概念介绍实现方法示例代码体验分享 我们在上一章回中介绍了滑动窗口相关的内容相关的内容&#xff0c;本章回中将介绍如何实现 滑动菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的滑动菜单表示屏幕上向左或者向右滑动滑动时弹…

服务器卡顿了该如何处理?

服务器卡顿了该如何处理&#xff1f; 当Windows系统的服务器出现卡顿问题时&#xff0c;以下是一些常见的故障排除步骤&#xff1a; 1.检查网络连接&#xff1a;确保服务器的网络连接正常。检查网络设备、交换机、防火墙等设备&#xff0c;确保它们正常运行。尝试通过其他计算…

自注意力机制

回顾以下注意力机制&#xff1a; 自注意力机制 Self-Attention的关键点 在于 K ≈ \approx ≈V ≈ \approx ≈Q 来源于同一个X&#xff0c;三者是同源的&#xff0c;通过 W Q W_Q WQ​, W K W_K WK​, W V W_V WV​做了一层线性变换。 接下来步骤和注意力机制一模一样。 …

基于微信小程序的线上教育课程付费商城(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

spring framework 5.2 AOP - spring低级的api

内容目录 1.Pointcut 切点切入点的操作 2.Spring 中的通知 APIadvice通知的生命周期 AOP的一般定义&#xff1a; AOP是一种编程范式&#xff0c;用于将关注点&#xff08;concerns&#xff09;从应用程序的主要业务逻辑中解耦。 关注点是指在应用程序中横切多个模块或组件的功…

【项目实战】Linux系统下jar包自启动

什么是jar包自启动 在Linux系统中&#xff0c;"jar包自启动"是指通过配置将Java程序打包成可执行的Jar文件&#xff0c;并设置其在系统启动时自动运行。以下是与jar包自启动相关的一些概念&#xff1a; Jar文件&#xff1a;Jar&#xff08;Java Archive&#xff09…

05贪心:买卖股票的最佳时机 II

05贪心&#xff1a;买卖股票的最佳时机 II 122. 买卖股票的最佳时机 II 这道题目可能我们只会想&#xff0c;选一个低的买入&#xff0c;再选个高的卖&#xff0c;再选一个低的买入…循环反复。 如果想到其实最终利润是可以分解的&#xff0c;那么本题就很容易了&#xff01…

蓝牙核心规范(V5.4)10.10-BLE 入门笔记之SMP和安全性

蓝牙篇之蓝牙核心规范(V5.4)深入详解汇总 1.概述 SMP是安全管理器协议,用于蓝牙低功耗系统的安全管理。SMP协议定义了配对和Key的分发过程的实现,以及用于实现这些方法的协议和工具。SMP的内容主要是配对和Key的分发,然后用Key对链路或数据进行加密 。 安全管理器协议(…

typedoc参数列表解释

输入选项 名称说明entryPoints这个选项用于指定Typedoc生成的文档的入口点。入口点是指被文档化的对象的定义所在的文件或模块。通过指定入口点&#xff0c;Typedoc可以找到被文档化的对象&#xff0c;并生成相应的文档。这个选项可以接受一个字符串或字符串数组&#xff0c;用…

K-最近邻算法

一、说明 KNN算法是一个分类算法&#xff0c;基本数学模型是距离模型。K-最近邻是一种超级简单的监督学习算法。它可以应用于分类和回归问题。虽然它是在 1950 年代引入的&#xff0c;但今天仍在使用。然而如何实现&#xff0c;本文将给出具体描述。 来源&#xff1a;维基百科 …

高速USB转4路RS422串口

基于480Mbps 高速USB转8路串口芯片CH344Q&#xff0c;可以为各类主机扩展出4个独立的串口。CH344芯片支持使用操作系统内置的CDC串口驱动&#xff0c;也支持使用厂商提供的VCP串口驱动程序&#xff0c;可支持Windows、Linux、Android、macOS等操作系统。因CDC类协议和类驱动的原…

Android 10.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

DA3 网站的第10位用户信息读取

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID …

git:一、GIT介绍+安装+全局配置+基础操作

版本管理系统&#xff08;SVN和Git&#xff09;&#xff1a; 集中式版本控制系统&#xff08;SVN&#xff09; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的. 工作流程如下: 1.从中央服务器远程仓库下载代码 2.修改后将代码提交到中央服务器远程仓库…

with ldid... /opt/MonkeyDev/bin/md: line 326: ldid: command not found

吐槽傻逼xcode 根据提示 执行了这个脚本/opt/MonkeyDev/bin/md 往这里面添加你brew install 安装文件的目录即可

华为云云耀云服务器L实例评测|如何保障华为云云耀云服务器L实例的安全和性能

引言 云耀云服务器L实例是华为云提供的高性能计算实例&#xff0c;为用户提供稳定可靠的云计算环境。为了保障实例的安全和性能&#xff0c;用户可以通过设置防火墙和安全组策略来限制网络访问和防止恶意攻击。华为云提供了灵活的管理工具&#xff0c;用户可以通过控制台、API…

关于ElementUI之首页导航与左侧菜单实现

目录 一.Mock 1.1.什么是Mock.js 1.2.特点 1.3.安装与配置 1.3.1. 安装mock.js 1.3.2.引入mock.js 1.4.mockjs使用 1.4.1.定义测试数据文件 1.4.2.mock拦截Ajax请求 1.4.3.界面代码优化 二.总线 2.1.是什么 2.2.前期准备 2.3.配置组件与路由关系 2.3.1. 配置组件 …

客户端负载均衡_负载均衡策略

以前的Ribbon有多种负载均衡策略 RandomRule - 随性而为 解释&#xff1a; 随机 RoundRobinRule - 按部就班 解释&#xff1a; 轮询 RetryRule - 卷土重来 解释&#xff1a; 先按照RoundRobinRule的策略获取服务&#xff0c;如果获取服务失败则在指定时间内会进行重试。 Weigh…