SDL2.0图片渲染封装
来源:互联网 发布:网络借贷 编辑:程序博客网 时间:2024/06/01 09:30
来源:http://blog.csdn.net/hiwubihe/article/details/52102110
最近几个项目视频处理中,渲染采用SDL2.0,现在封装一个SDL2.0类,方便大家使用。SDL2.0库调用流程如下:
Sdl2Handle.h
#ifndef _SDL2HANDLE_H_ #define _SDL2HANDLE_H_//基于SDL2.0实现的图片渲染器//SDL_Window就是使用SDL的时候弹出的那个窗口。在SDL2.0版本中,可以创建多个窗口。//SDL_Texture用于显示YUV数据。一个SDL_Texture对应一帧YUV数据。//SDL_Renderer用于渲染SDL_Texture至SDL_Window。//SDL_Rect用于确定SDL_Texture显示的位置。注意:一个SDL_Texture可以指定多个不同的SDL_Rect,这样就可以在SDL_Window不同位置显示相同的内容(使用SDL_RenderCopy()函数)。extern "C" { #include "SDL.h" }; class CSdl2Handle{public:CSdl2Handle();~CSdl2Handle();bool SdlOpen(void *pWndHandle,const char *pTitle,int iWidth,int iHeight);void SdlClose();//显示一帧YV12数据 iLinesize YUV每个分量 每行数据宽度 不一定等于图片宽度void SdlDisplayFrame(uint8_t *pszData[],int iLinesize[],int iFlag);//YUV显示BMP图片bool SdlDisplayBmp(char *pFilePath);public:static bool SdlInit();static void SdlUnInit();private://显示窗口SDL_Window * m_pWnd; //图片渲染器SDL_Renderer* m_pRender; //图片装载器SDL_Texture* m_pTexture; //显示位置(一个窗口可以有多个显示位置,当前支持一个)SDL_Rect m_Rect; //标志窗口是否本层创建bool m_IsSdlCreate;};#endif
Sdl2Handle.cpp
#include "stdafx.h"#include "Sdl2Handle.h"#include <stdio.h>//初始化SDLbool CSdl2Handle::SdlInit(){if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { return false;} }//反初始化SDLvoid CSdl2Handle::SdlUnInit(){SDL_Quit();}CSdl2Handle::CSdl2Handle(){//显示窗口SDL_Window * m_pWnd=NULL; //图片渲染器SDL_Renderer* m_pRender=NULL; //图片装载器SDL_Texture* m_pTexture=NULL; //标志窗口是否本层创建m_IsSdlCreate=true;}CSdl2Handle::~CSdl2Handle(){SdlClose();}bool CSdl2Handle::SdlOpen(void *pWndHandle,const char *pTitle,int iWidth,int iHeight){bool bRet=true;do{if(!pWndHandle){m_pWnd =SDL_CreateWindow(pTitle, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, iWidth, iHeight, SDL_WINDOW_OPENGL);if(!m_pWnd){printf("SDL: 创建窗口失败 - 错误信息:%s\n",SDL_GetError()); bRet=false;break;}}else{m_pWnd =SDL_CreateWindowFrom(pWndHandle);if(!m_pWnd){printf("SDL: 创建窗口失败 - 错误信息:%s\n",SDL_GetError()); bRet=false;break;}m_IsSdlCreate=false;}m_pRender = SDL_CreateRenderer(m_pWnd, -1, 0); m_pTexture = SDL_CreateTexture(m_pRender, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, iWidth, iHeight); m_Rect.x=0; m_Rect.y=0; m_Rect.w=iWidth; m_Rect.h=iHeight; }while(0);return bRet; }void CSdl2Handle::SdlClose(){if(m_pTexture){SDL_DestroyTexture(m_pTexture);m_pTexture=NULL;}if(m_pRender){SDL_DestroyRenderer(m_pRender);m_pRender=NULL;}if(m_pWnd){//SDL本身创建 销毁if(m_IsSdlCreate){SDL_DestroyWindow(m_pWnd);}}}void CSdl2Handle::SdlDisplayFrame(uint8_t*pszData[],int iLinesize[],int iFlag){//一帧YV12数据填充到 图片装载器中 颜色反了 可能 U和V反了if(iFlag){SDL_UpdateYUVTexture(m_pTexture, &m_Rect,(const Uint8 *)pszData[0], iLinesize[0],(const Uint8 *)pszData[2], iLinesize[2],(const Uint8 *)pszData[1], iLinesize[1]);}else{SDL_UpdateYUVTexture(m_pTexture, &m_Rect,(const Uint8 *)pszData[0], iLinesize[0],(const Uint8 *)pszData[1], iLinesize[1],(const Uint8 *)pszData[2], iLinesize[2]);}//清屏SDL_RenderClear( m_pRender ); //装载器数据渲染到窗口SDL_RenderCopy( m_pRender, m_pTexture, NULL, &m_Rect); //刷新SDL_RenderPresent( m_pRender ); }//YUV显示BMP图片bool CSdl2Handle::SdlDisplayBmp(char *pFilePath){SDL_Surface *pBmp = NULL;pBmp = SDL_LoadBMP(pFilePath);if (pBmp == NULL) {printf("SDL_LoadBMP failed: %s", SDL_GetError());return false;}SDL_Texture* pTmpTexture=NULL; pTmpTexture = SDL_CreateTextureFromSurface(m_pRender, pBmp);//清屏SDL_RenderClear( m_pRender ); //装载器数据渲染到窗口SDL_RenderCopy( m_pRender, pTmpTexture, NULL, &m_Rect); //刷新SDL_RenderPresent( m_pRender ); //销毁临时SDL_FreeSurface(pBmp);SDL_DestroyTexture(pTmpTexture);return true;}
阅读全文
0 0
- SDL2.0图片渲染封装
- SDL2.0图片渲染封装
- 零基础学习SDL开发之在Android使用SDL2.0渲染PNG图片
- sdl2.0使用SDL_RenderCopyEx进行图片旋转
- SDL2.0
- sdl2显示bmp图片
- SDL2.0 Image扩展库绘制TGA图片
- SDL2.0 扣色(png图片重叠,前景色透明)
- SDL2.0 ubuntu complie
- SDL2.0上手试用
- ffmpeg and SDL2.0
- SDL2.0上手试用
- SDL2.0 播放YUV
- sdl2.0示例
- sdl2.0_opencv
- SDL2.0+ffmpeg2.3
- SDL2.0_01_hello world!
- SDL2.0_02_functions
- JQuery基础知识
- 当前不会命中断点。源代码与原始版本不同 (VS2012)
- 27-IO流(流的操作基本规律)12 需求提现12 30-IO流(转换流的编码解码) 32-IO流(File对象-常见功能-获取)
- PHP中被忽略的性能优化利器:生成器
- HTML5的Video标签的属性,方法和事件汇总
- SDL2.0图片渲染封装
- 使用Spring发送电子邮件
- 北京市顺义区谷歌卫星地图下载
- vs2017上配置HALCON 12
- Android自定义属性,format详解
- WebStorm与Git使用指南
- Markdown系列(1)- 语法手册
- Kafka学习之一 :安装启动
- UVA 532--Dungeon Master