ffmpeg-SDL显示BMP

server/2024/12/24 10:36:50/

效果图如下
在这里插入图片描述

在这里插入图片描述
本文主要将我们通过创建窗口、渲染上下文工具、纹理工具、矩形框工具;其需要主要的是:首先我们在显示BMP时,需要先创建好窗口,再使用渲染工具对窗口进行格式刷,使用纹理工具和渲染工具配合进行BMP图片显示,矩形框的作用就是显示BMP图片的大小。

下面小例子就是当鼠标点击时,会通过texture纹理工具,使用渲染拷贝一份纹理显示至window窗口

#include "playthread.h"
#include <SDL2/SDL.h>
#include <QDebug>
#include <QFile>//#号自动添加双引号“”
#define END(judge,SDL_Init) \if(judge) \{\qDebug() << #SDL_Init << "error" << SDL_GetError();\goto end;\}playThread::playThread(QObject *parent) : QThread(parent)
{//监听线程,线程结束后自动释放线程内存connect(this,&playThread::finished,this,&playThread::deleteLater);
}playThread::~playThread()
{disconnect();//?requestInterruption();quit();wait();qDebug() << "析构了";
}void playThread::run()
{//创建窗口SDL_Window *window = nullptr;//渲染上下文SDL_Renderer *renderer = nullptr;//纹理(直接跟特定驱动程序相关的像素数据)SDL_Texture *texture = nullptr;//矩形框SDL_Rect dstRect = {0,0,50,50};//初始化子系统END(SDL_Init(SDL_INIT_VIDEO),SDL_Init);//创建一个窗口//标题-X-Y-width-heightwindow = SDL_CreateWindow("SDL修改渲染目标",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,500,500,SDL_WINDOW_SHOWN);END(!window,SDL_CreateWindow);//创建渲染上下文--用于渲染图形到窗口//这SDL_RENDERER_ACCELERATED -- 个标志告诉 SDL 尝试创建一个使用硬件加速的渲染器//SDL_RENDERER_PRESENTVSYNC -- 这个标志使渲染器的呈现操作同步到显示器的垂直同步(VSync)renderer = SDL_CreateRenderer(window, -1,SDL_RENDERER_ACCELERATED |SDL_RENDERER_PRESENTVSYNC);//如果创建失败if(!renderer){renderer = SDL_CreateRenderer(window,-1,0);END(!renderer,SDL_CreateRenderer);}//创建纹理texture = createTexture(renderer);END(!texture,SDL_CreateTextureFromSurface);//设置渲染目标为windows -- nullptr默认为windowsEND(SDL_SetRenderTarget(renderer,nullptr),SDL_SetRenderTarget);//设置绘制颜色(画笔颜色)END(SDL_SetRenderDrawColor(renderer,0,0,0,SDL_ALPHA_OPAQUE),SDL_SetRenderDrawColor);//用绘制颜色(画笔颜色)清除渲染目标---也就是覆盖END(SDL_RenderClear(renderer),SDL_RenderClear);//拷贝纹理到渲染目标END(SDL_RenderCopy(renderer,texture,nullptr,&dstRect),SDL_rSDL_RenderCopyen);//更新所有的渲染操作到屏幕上SDL_RenderPresent(renderer);//等待退出事件while(!isInterruptionRequested()){SDL_Event event;SDL_WaitEvent(&event);switch(event.type){case SDL_QUIT:{goto end;break;}case SDL_MOUSEBUTTONUP:{showClick(event,renderer,texture);break;}}}end:SDL_DestroyRenderer(renderer);SDL_DestroyTexture(texture);SDL_DestroyWindow(window);SDL_Quit();//初始化子系统后必须做一个退出操作
}SDL_Texture *playThread::createTexture(SDL_Renderer *renderer)
{//创建一个纹理对象SDL_Texture *texture = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB24,SDL_TEXTUREACCESS_TARGET,50,50);if(!texture){//创建失败return nullptr;}//设置纹理为渲染目标if(SDL_SetRenderTarget(renderer,texture)){return nullptr;}//设置颜色if(SDL_SetRenderDrawColor(renderer,255,255,0,SDL_ALPHA_OPAQUE)){return nullptr;}//画图形SDL_Rect rect = {0,0,50,50};if(SDL_RenderDrawRect(renderer,&rect)){return nullptr;}if(SDL_RenderDrawLine(renderer,0,0,50,50)){return nullptr;}if(SDL_RenderDrawLine(renderer,50,0,0,50)){return nullptr;}return texture;
}void playThread::showClick(SDL_Event &event, SDL_Renderer *renderer,SDL_Texture *texture)
{SDL_MouseButtonEvent btn = event.button;int w = 0,h = 0;if(SDL_QueryTexture(texture,nullptr,nullptr,&w,&h)){return;}int x = btn.x - (w >> 1);int y = btn.y - (h >> 1);SDL_Rect dstRect = {x,y,w,h};//SDL_RenderClear(renderer);//赋值纹理到渲染目标SDL_RenderCopy(renderer,texture,nullptr,&dstRect);//更新渲染操作到屏幕上SDL_RenderPresent(renderer);
}

http://www.ppmy.cn/server/152752.html

相关文章

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …

合合信息:探索视觉内容安全新前沿

2024年12月13日-15日&#xff0c;中国图象图形学学会在杭州召开。大会期间&#xff0c;来自合合信息的图像算法研发总监郭丰俊进行了主题为“视觉内容安全技术的前沿进展与应用”的演讲&#xff0c;介绍了视觉内容安全问题&#xff0c;并总结了现今的技术发展&#xff0c;对我很…

金仓 Kingbase 日常运维 SQL 汇总

金仓 Kingbase 日常运维 SQL 汇总 1 单机启停 sys_ctl start|stop|restart 或指定data路径和端口等 sys_ctl start|stop|restart -D /data/kingbase/data -p 543222 集群启停 sys_monitor start|stop|restart3 修改配置后重新加载 sys_ctl reload4 初始化实例 initdb -E ut…

glfwWindowHint、glfwCreateWindow、上下文对象共享之间的关系

理解 创建窗口HINT、创建窗口 和 上下文对象共享 之间的关系&#xff0c;首先需要了解这三个概念如何在 GLFW 中一起工作。以下是它们之间关系的详细解释&#xff1a; 1. 创建窗口HINT&#xff08;Window Hints&#xff09; glfwWindowHint 用于设置窗口和上下文的创建提示。提…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器&#xff1a; 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

DG常用启动方法与异常查找

--查看主库的状态&#xff1a; select a.inst_id,a.db_unique_name,a.database_role, a.protection_level,a.protection_mode,a.open_mode,a.log_mode,a.switchover_status, b.host_name,b.thread# from gv$database a left join gv$instance b on a.inst_idb.inst_id order by…

Redisson分布式锁的源码解读

之前秒杀项目中就用到了这个 Redisson 分布式锁 &#x1f447;&#xff0c;这篇就一起来看看源码吧&#xff01; tryLock 加锁 流程 // RedissonLock.java Override public boolean tryLock() {return get(tryLockAsync()); }Override public RFuture<Boolean> tryLockAs…