怎么在c#中利用SDL2实现一个视频播放窗口截的图

  介绍

本篇文章给大家分享的是有关怎么在c#中利用SDL2实现一个视频播放窗口截的图,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

具体方法如下

///& lt; summary>///SDL2截图操作类///& lt;/summary>
  公共安全类SDLScreenshot
  {
  IntPtr窗口;//窗口对象
  IntPtr渲染器;//播放窗口的渲染器(来自于已初始化的播放窗口渲染器)
  公共SDLScreenshot (IntPtr窗口,IntPtr渲染器)
  {
  这一点。窗口=窗口;
  这一点。渲染器=渲染器;
  }///& lt; summary>///保存截的图///& lt;/summary>///& lt;参数name=皐idth"祝辞& lt;/param>///& lt;参数name=癶eight"祝辞& lt;/param>///& lt;参数name=皃ath"祝辞& lt;/param>
  公共空间SaveBMP (int宽度,int高度,字符串路径)
  {//判断渲染器是否初始化
  如果(渲染器==IntPtr.Zero)
  {
  Console.WriteLine(“渲染器为空,请调用Init()方法!”);
  返回;
  }
  使用uint Rmask=0 x00ff0000解马赛克软件=0 x0000ff00 Bmask=0 x000000ff Amask=0 x00000000;//获取图像数据
  SDL。SDL SDL_Surface *表面=(SDL.SDL_Surface *)。SDL_CreateRGBSurface(0,宽度,高度,32岁,Rmask,解马赛克软件,Bmask, Amask);//设置纹理的数据
  SDL。SDL_Rect destrect;
  destrect。x=0;
  destrect。y=0;
  destrect。w=宽度;
  destrect。h=身高;//读取并渲染图像数据
  SDL。SDL_RenderReadPixels (ref destrect渲染器,SDL。SDL_PIXELFORMAT_ARGB8888、表面→像素,表面→节);//保存图片
  int i=SDL.SDL_SaveBMP ((IntPtr)表面,路径);
  如果(我!=0)
  {
  Console.WriteLine(“截图失败!”+ SDL.SDL_GetError ());
  }
  
  SDL.SDL_FreeSurface ((IntPtr)表面);//SDL.SDL_RenderClear(渲染器);//SDL.SDL_DestroyRenderer(渲染器);
  }///& lt; summary>///加载截的图///& lt;/summary>///& lt;参数name=皐idth"祝辞& lt;/param>///& lt;参数name=癶eight"祝辞& lt;/param>///& lt;参数name=皃ath"祝辞& lt;/param>
  公共空间LoadBMP (int宽度,int高度,字符串路径)
  {//判断渲染器是否初始化
  如果(渲染器==IntPtr.Zero)
  {
  Console.WriteLine(“渲染器为空,请调用Init()方法!”);
  返回;
  }//加载图片
  IntPtr表面=SDL.SDL_LoadBMP(路径);
  如果(表面==IntPtr.Zero)
  {
  Console.WriteLine(“负载bmp失败!”+ SDL.SDL_GetError ());
  返回;
  }
  IntPtr纹理=SDL。SDL_CreateTextureFromSurface(渲染器、表面);
  如果(纹理==IntPtr.Zero)
  {
  Console.WriteLine(“创建纹理失败!”+ SDL.SDL_GetError ());
  返回;
  }
  SDL.SDL_FreeSurface(表面);//设置纹理的数据
  SDL。SDL_Rect destrect;
  destrect。x=0;
  destrect。y=0;
  destrect。w=宽度;
  destrect。h=身高;
  
  SDL。SDL_Rect srcrect=destrect;//SDL.SDL_RenderClear(渲染器);
  SDL。SDL_RenderCopy(渲染器、质地、ref srcrect ref destrect);
  SDL.SDL_RenderPresent(渲染器);//SDL.SDL_Delay (20);
  SDL.SDL_DestroyTexture(纹理);//SDL.SDL_DestroyRenderer(渲染器);//SDL.SDL_DestroyWindow(屏幕);//退出SDL//SDL.SDL_Quit ();
  }
  }

<强>播放测试代码:

 

测试效果图:

怎么在c#中利用SDL2实现一个视频播放窗口截图

注:此处截图是直接获取的播放窗口的图像像素来实现的。

<强>视频字幕

///& lt; summary>///SDL2字幕显示类///& lt;/summary>
  公共安全类SDLTTF
  {
  IntPtr渲染器;//播放窗口的渲染器(来自于已初始化的播放窗口渲染器)
  
  公共SDLTTF (IntPtr渲染器)
  {
  这一点。渲染器=渲染器;
  }///& lt; summary>///展示字幕文字///& lt;/summary>///& lt;参数name=皌ext"祝辞& lt;/param>
  公共空间ShowText(字符串ttfPath, int字形大小,字符串文本)
  {//初始化ttf
  如果(SDL_ttf.TTF_Init () & lt;0)
  {
  Console.WriteLine (“SDL_ttf.TTF_Init()失败!”);
  返回;
  }//是否初始化完成
  int was_init=SDL_ttf.TTF_WasInit ();
  
  如果(was_init==1)//SDL_ttf已经初始化
  Console.WriteLine (“SDL_ttf已经initialized");
  else if (was_init==0)//SDL_ttf不是已经初始化
  Console.WriteLine (“SDL_ttf不是已经initialized");//判断是否初始化
  如果(渲染器==IntPtr.Zero)
  {
  由SDL_ttf.TTF_Init Console.WriteLine(“没有初始化(),请调用Init()方法!”);
  返回;
  }//如:打开ttfPath=simfang。ttf字库,设字体为字形大?20号=SDL_ttf IntPtr字体。TTF_OpenFont (ttfPath字形大小);
  如果字体==IntPtr.Zero)
  {
  Console.WriteLine(“开放字体失败!”+ SDL.SDL_GetError ());
  返回;
  }//设置文字颜色
  SDL。SDL_Color颜色;
  颜色。一个=255;
  颜色。r=255;
  颜色。g=255;
  颜色。b=255;//渲染文字效果//=SDL_ttf IntPtr表面。TTF_RenderUTF8_Blended(字体、文本颜色);=SDL_ttf IntPtr表面。TTF_RenderUNICODE_Blended(字体、文本颜色);
  如果(表面==IntPtr.Zero)
  {
  Console.WriteLine(“显示表面失败!”+ SDL.SDL_GetError ());
  }
  IntPtr纹理=SDL。SDL_CreateTextureFromSurface(渲染器、表面);
  如果(纹理==IntPtr.Zero)
  {
  Console.WriteLine(“创建纹理失败!”+ SDL.SDL_GetError ());
  }
  SDL.SDL_FreeSurface(表面);//关闭字体
  SDL_ttf.TTF_CloseFont(字体);//停止显示
  SDL_ttf.TTF_Quit ();//设置纹理的数据
  SDL。SDL_Rect destrect;
  destrect。x=0;
  destrect。y=0;
  destrect。w=文本。长度* 20;
  destrect。h=20;
  
  SDL。null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

怎么在c#中利用SDL2实现一个视频播放窗口截的图