`
lobin
  • 浏览: 426003 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C: Linux C 编程 - SDL图像处理

 
阅读更多

图像处理

YUV图像

YUV图像是一种采用YUV颜色空间来表示图像中的每个像素。这个就像用RGB颜色空间来图像中的每个像素那样。一个是Y,U,V三个分量,一个是R,G,B三个分量。

 

YUV图像相比其他图像要大的多,我一张原始的100多K的jpg图像文件,同样大小转换为YUV图像后500多K。一张原始的10几M的mp4视频文件,同样大小转换为YUV视频后1.3个多G。

 

显示YUV图像

此程序支持显示yuv420p,yuvj420p格式的YUV图像。其他格式的YUV图像没测试。

#include<stdio.h>
#include<SDL_video.h>
#include<SDL_render.h>
#include<SDL_surface.h>
#include<SDL_events.h>

int main(int argc, char **argv)
{
  char *filename = "H:\\huacao-pix_fmt_yuvj420p-320x180.yuv"; // "H:\\huacao-pix_fmt_yuvj420p-320x180.yuv"; // "H:\\huacao-pix_fmt_yuvj420p-1024x680.yuv"; // "H:\\huacao-pix_fmt_yuv420p-320x180.yuv";
  FILE *fp = NULL;
  
  SDL_Window *pWin;
  int width = 640;
  int height = 360;

  SDL_Renderer *renderer;
  SDL_Texture *texture;
  SDL_Rect rect;

  int pix_width = 320;
  int pix_height = 180;
  int bpp = 12;

  unsigned char *buf;
  int buf_size;

  SDL_Event e;
  int exit = 0;
  pWin = SDL_CreateWindow("Player", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE); // SDL_WINDOW_FULLSCREEN, SDL_WINDOW_RESIZABLE
  if (pWin == NULL)
  {
    fprintf(stderr, "create window err.\n");
    return 1;
  }

  renderer = SDL_CreateRenderer(pWin, -1, 0);
  if (renderer == NULL) 
  {
    fprintf(stderr, "create renderer err: %s\n", SDL_GetError());
    return 1;
  }

  texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, pix_width, pix_height);
  if (texture == NULL) 
  {
    fprintf(stderr, "create texture err: %s\n", SDL_GetError());
    return 1;
  }

  fp = fopen(filename, "rb+");
  if (fp == NULL) 
  {
    fprintf(stderr, "open err: %s\n", filename);
    return 1;
  }

  buf_size = pix_width * pix_height * bpp / 8;
  buf = (unsigned char *) malloc(buf_size + 1);

  if (fread(buf, buf_size, 1, fp) != 1) 
  {
    fprintf(stderr, "read err: %s\n", filename);
    return 1;
  }
  SDL_UpdateTexture(texture, NULL, buf, pix_width);
  rect.x = 0;
  rect.y = 0;
  rect.w = width;
  rect.h = height;

  SDL_RenderClear(renderer);
  SDL_RenderCopy(renderer, texture, NULL, &rect);
  SDL_RenderPresent(renderer);

  while (! exit)
  {
    while (SDL_PollEvent(&e))
    {
      if (e.type == SDL_QUIT)
      {
        exit = 1;
      }
    }
  }

  SDL_DestroyWindow(pWin);
  SDL_Quit();
  return 0;
}

BMP图像

显示BMP图像

#include<stdio.h>
#include<SDL_video.h>
#include<SDL_render.h>
#include<SDL_surface.h>
#include<SDL_events.h>

int main(int argc, char **argv)
{
  SDL_Window *pWin;
  SDL_Renderer *renderer;
  SDL_Surface *bmp;
  SDL_Texture *texture;

  SDL_Event e;
  int exit = 0;
  pWin = SDL_CreateWindow("SDL", 100, 100, 500, 500, SDL_WINDOW_RESIZABLE); // SDL_WINDOW_FULLSCREEN, SDL_WINDOW_RESIZABLE
  if (pWin == NULL)
  {
    fprintf(stderr, "create window err.\n");
    return 1;
  }
  renderer = SDL_CreateRenderer(pWin, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  if (renderer == NULL) 
  {
    fprintf(stderr, "create renderer err: %s\n", SDL_GetError());
    return 1;
  }

  bmp = SDL_LoadBMP("huacao.bmp");
  if (bmp == NULL) 
  {
    fprintf(stderr, "load bmp err: %s\n", SDL_GetError());
    return 1;
  }

  texture = SDL_CreateTextureFromSurface(renderer, bmp);
  if (texture == NULL) 
  {
    fprintf(stderr, "create texture err: %s\n", SDL_GetError());
    return 1;
  }

  SDL_FreeSurface(bmp);

  SDL_RenderClear(renderer);

  SDL_RenderCopy(renderer, texture, NULL, NULL);

  SDL_RenderPresent(renderer);

  while (! exit)
  {
  
    while (SDL_PollEvent(&e))
    {
      if (e.type == SDL_QUIT)
      {
        exit = 1;
        
      }
      else if (e.type == SDL_WINDOWEVENT)
      {
        if (e.window.event == SDL_WINDOWEVENT_RESIZED)
        {
         
        }
        else if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
        {
        }
      }
    }
  }

  SDL_DestroyTexture(texture);
  SDL_DestroyRenderer(renderer);

  SDL_DestroyWindow(pWin);
  SDL_Quit();
  return 0;
}

 

0
1
分享到:
评论

相关推荐

    C语言案例1:SDL2游戏编程基础之环境准备-配套资源.zip

    在本资源包中,我们主要关注的是C语言与SDL2库结合进行游戏编程的基础知识。SDL2(Simple DirectMedia Layer 2)是一个跨平台的开发库,它为开发者提供了丰富的功能,包括图形渲染、音频处理、事件管理等,是创建2D...

    tank-sdl-0.3.0.tar.gz_game tank sdl_sdl game sour_tank-sdl _tan

    SDL提供了基本的窗口管理、图像渲染、音频播放和键盘/鼠标输入处理等功能,是许多初学者和专业开发者入门游戏编程的首选库。 在"tank-sdl-0.3.0"源代码中,我们可以学习到以下关键点: 1. **游戏循环**:任何游戏...

    sdl的linux源码包SDL2-2.0.2

    **标题与描述解析** 标题"SDL2-2.0.2"指的是...熟悉C/C++编程是必要的,因为这是SDL2主要支持的语言。对于Linux运维人员来说,理解如何在服务器上安装、管理和更新SDL2库,以及解决相关的依赖问题,也是重要的技能。

    imgviewer-sdl:imgviewer-sdl

    【imgviewer-sdl:一个...通过这个项目,开发者可以学习到如何利用C++进行文件操作、图像处理、用户界面设计以及多平台应用开发。同时,对于想要深入了解图形编程和SDL库的人来说,imgviewer-sdl是一个很好的学习实例。

    Android-运行在Android之上的Go-SDL2示例

    它提供了窗口管理、事件处理、音频输出、图像加载和渲染、以及键盘和鼠标输入等功能。SDL2的一个主要优点是它的跨平台性,可以在Windows、Linux、Mac OS X、Android和iOS等操作系统上运行。 **Android NDK和JNI** ...

    node-sdl:Node.js的SDL2绑定

    SDL2是用C语言编写的,但具有良好的可扩展性,可以通过绑定到其他编程语言,如Python、Java、甚至JavaScript。它的核心功能包括: 1. **图形渲染**:SDL2支持2D渲染,可以创建窗口、绘制图形、线条和文本。它还提供...

    linux-winows-跨平台开源图形库 SDL-1.2

    在Linux和Windows操作系统上,SDL 提供了一个统一的编程接口,使得开发者可以在多个平台上轻松移植代码。 标题“linux-winows-跨平台开源图形库 SDL-1.2”明确指出,这个资源是关于 SDL 库的一个特定版本——1.2.13...

    JEDI_SDL delphi开发库(可以用来开发跨WINDOWS和LINUX的游戏)

    JEDI_SDL Delphi 开发库是一个强大的工具,它允许开发者使用Delphi编程语言来创建跨平台的游戏和多媒体应用,支持Windows和Linux操作系统。这个库是基于Simple DirectMedia Layer (SDL) 库的,SDL是一个广泛使用的跨...

    alien-sdl-开源

    这包括初始化和关闭SDL环境、设置窗口、加载图像、播放音频、处理键盘和鼠标输入等各种功能。这样的绑定使得Lisp开发者无需直接编写C代码,就能充分利用SDL的功能,降低了开发复杂度,提高了开发效率。 例如,使用...

    neovim-sdl2:适用于Neovim的SDL2 GUI

    Neovim是一款高度可配置的、现代化的文本编辑器,而SDL2(Simple DirectMedia Layer 2)则是一个跨平台的开发库,主要用于处理多媒体和图形用户界面,包括窗口管理、图像渲染、输入设备管理等。 **描述分析:** ...

    SDL2.0.3源码安装包

    2. **Linux环境下的图形编程**:在Linux系统中,开发者通常需要直接操作X Window System或Wayland等窗口系统来实现图形界面,而SDL库则抽象了这些复杂的接口,提供了一套统一的编程模型。 3. **SDL2.0.3版本特点**...

    快乐成长贪吃蛇(Linux+C+SDL)

    《快乐成长贪吃蛇》是一款基于Linux平台,利用C语言编程和SDL库开发的教育娱乐游戏。这款项目旨在将经典游戏“贪吃蛇”与学习元素相结合,特别针对100美元笔记本用户,旨在提供一个寓教于乐的环境,帮助儿童在玩乐中...

    SDL-1.2.15-lib包含源码

    SDL(Simple DirectMedia Layer)是一个开源的跨平台开发库,主要用于多媒体编程,包括音频处理、图形绘制和输入设备管理等。SDL库是游戏开发、媒体播放器和其他图形应用程序的理想选择,因为它提供了低级别的硬件...

    C语言+SDL(linux贪吃蛇游戏)

    贪吃蛇游戏,作为一个经典的编程实践项目,可以很好地展示C语言的基本功能以及SDL库在图形界面处理中的应用。本项目结合了C语言与SDL(Simple DirectMedia Layer)库,使得在Linux环境下开发图形化游戏成为可能。...

    SDL2-2.0.12-win-x64_x86.zip

    - **图像加载与处理**:通过SDL_image库,可以加载和显示各种图像格式(如PNG、JPEG)。 - **视频播放**:结合SDL_mixer,可以播放音频文件和视频流。 - **物理模拟**:与Box2D等物理引擎结合,实现游戏中的物理行为...

    基于SDL的音乐播放器

    - 使用SDL时,开发者可能需要熟悉C或C++编程,因为SDL是用这些语言编写的。同时,调试过程中可能涉及音频解码错误、内存管理和性能优化等问题。 通过这个基于SDL的音乐播放器,我们可以学习到多媒体处理、用户界面...

    sdl.rar SDL2-2.0.14 SDL源码

    **标题与描述解析** ...要学习和使用SDL2,开发者通常需要具备C或C++编程基础,了解基本的计算机图形学原理,并熟悉使用相应平台的开发环境。通过阅读官方文档和实践项目,可以逐步掌握SDL2的各种功能。

    视频显示库SDL

    同时,它也支持多线程编程,以实现并发处理。 **2. SDL的平台兼容性** SDL的设计目标是跨平台,因此可以在多个操作系统上运行,包括Windows、Linux、Mac OS X、iOS、Android等。通过统一的API,开发者可以编写一次...

    C语言SDL坤坤推箱子.zip

    而SDL(Simple DirectMedia Layer)是C语言的一个开源图形库,它为开发者提供了丰富的图形、音频和输入处理功能,使得用C语言开发2D游戏变得更加便捷。本文将详细介绍如何使用C语言和SDL库来构建一个坤坤版的推箱子...

    SDL封装(SDL:二维图形类库)

    **SDL(Simple DirectMedia Layer)** 是一个跨平台的多媒体开发包,支持Windows、Linux等操作系统。它主要用于游戏开发以及其他高性能的实时多媒体应用,提供对键盘、鼠标、手柄以及音频、视频等设备的访问接口。在...

Global site tag (gtag.js) - Google Analytics