SDL图像显示

简介: 计算机屏幕上的图像是由一个一个点组成的,不同颜色的点集合在一起,就构成了一幅图片。在屏幕上显示图像,就是对每一个像素点进行着色。首先我们对图片进行分析,取出每一个点的像素,CPU会将其保存在显存中,然后计算机会根据保存的像素,在屏幕上从上到下逐行逐点显示出来

       计算机屏幕上的图像是由一个一个点组成的,不同颜色的点集合在一起,就构成了一幅图片。在屏幕上显示图像,就是对每一个像素点进行着色。首先我们对图片进行分析,取出每一个点的像素,CPU会将其保存在显存中,然后计算机会根据保存的像素,在屏幕上从上到下逐行逐点显示出来。
        计算机用分辨率来表示有多少个点,800X600,1024X648等,第一个数字表示屏幕宽,第二个表示屏幕的高。用二维坐标系X,Y来表示计算机屏幕。我们要在屏幕哪个位置画图象,就可以设置X,Y坐标。
        我们需要三个参数,屏幕宽、高以及像素色彩位数。
         SCREEN_WIDTH                             屏幕宽度
         SCREEN_HEIGHT                            屏幕高度
        SCREEN_BPP                                    屏幕所使用的像素色彩位数

SDL_image库的使用

        SDL默认只支持bmp格式的图片显示,而大多数情况下,我们需要显示jpeg,png格式图片,这时候我们需要使用SDL扩展库。在开发前应先确认SDL_image库是否已编译安装成功。

       首先需要先下载SDL_image,可以从SDL的官网获取最新版本。你也可以从其中的“Libraries”章节下载这个库,就在SDL的主页上。

       在程序中使用SDL_ttf库,必须使用如下头文件,注意SDL是大写

         #include<SDL_image.h>

        Linux应用程序链接时要也要链接这个库的-lSDL_image。

SDL_image编程

         BMP格式的图片为例:

         初始化

         先对屏幕进行初始化,使用函数SDL_SetVideoMode(w,h, desired_bpp, video_flags)来完成,设定屏幕参数。

下载图片到内存

         设置好后,导入位图,将其下载于内存中,bmpfile为选定的图片名:

       img = SDL_LoadBMP(filename);图象如果导入正确,就将保存在img参数中。 

建立最佳图像 

如果有较多图片,有可能是32位的,也有可能是24位的。为了提高显示速度,我们应该在显示之前将所有图象的格式转换成一样的。使用SDL_DisplayFormat函数将图象的格式转换为同屏幕相同的格式。

                      newimg = SDL_DisplayFormat( img );
假设我们导入到img中的图象是24位的,但屏幕的格式是32位的。经过SDL_DisplayFormat函数转换后,图象格式就变成了32位,然后保存在newimg中。对于原来24位的图象img,我们就不需要,就要调用SDL_FreeSurface函数去释放它。
 显示图像 
导入成功后,我们需将图像显示出来。
                 SDL_BlitSurface(newimg, &clip,screen,&dst)
          newimg为要显示的图片;clip为图片参数;screen为屏幕,也可以是一张图片;dst为显示位置。将newimg图象按照dst规定的坐标贴在screen屏幕上。
       刷新屏幕变化部分:
                      SDL_UpdateRects(screen,1,&dst)
         这样,我们就将一幅BMP格式的图片显示在屏幕上。

       有时候我们需要显示一张图片的一部分,只需对上面的参数SDL_Rect*clip进行定义就可实现。

        释放内存

         使用SDL_FreeSurface(newimg);

        Jpeg、png图片显示

        与bmp格式图片显示有两点不同:

        首先是把SDL_LoadBMP改成IMG_Load。

        其次,把SDL_DisplayFormat改成SDL_DisplayFormatAlpha。BMP文件不支持alpha通道的吧,但PNG却支持。如果想留住alpha通道,那就需要用SDL_DisplayFormatAlpha来代替SDL_DisplayFormat。

         例程如下(编译时注意链接-lSDL_image):

        #include

        SDL_Surfacescreen,map;

        staticvoid quit(int rc)

        {

           SDL_Quit();

           exit(rc);

         }

         voidShowMap(char *filename,int x,int y)

        {

           SDL_Rectoffset;

           map= IMG_Load(filename);

           if(map== NULL){

                 fprintf(stderr,"Couldn'tload %s:%s\n",filename,SDL_GetError());

                 quit(1);

           }

           offset.x= x;

           offset.y= y;

           SDL_BlitSurface(map,NULL,screen,&offset);

           SDL_UpdateRects(screen,1,&offset);

           SDL_FreeSurface(map);

              }

              intmain(int argc,char *argv[])

             {

           char*file;

           intw,h;

           Uint8bpp;

           Uint32flags;

           w= 320;

           h= 240;

           bpp= 0;

           flags= SDL_SWSURFACE;

           if(SDL_Init(SDL_INIT_VIDEO)< 0){

                    fprintf(stderr,"Couldn'tinitialize SDL:%s\n",SDL_GetError());

                    return(1);

           }

           if((screen=SDL_SetVideoMode(w,h,bpp,flags))== NULL){

                    fprintf(stderr,"Couldn'tset %dx%dx%d video mode: %s\n",w,h,bpp,SDL_GetError());

                    quit(1);

           }

           SDL_WM_SetCaption("SDLjice","jicetest");

           ShowMap("maps/Pepe.jpg",0,0);

           ShowMap("maps/100.bmp",100,50);

           SDL_Delay(1000);

           SDL_Quit();

           return0;

                }

Agar压缩或放大图片

在许多应用中,我们需要将图片完整的显示在屏幕中,或者根据需要大小来指定显示图片的大小。而图片的尺寸经常与我们所需要的尺寸不一致,即使将图片在规定的尺寸内显示出来,也会因为图片太大而显示速度很慢,或者因为图片太小而严重失真。因此,我们需要将大图片压缩至指定大小,将小图片放大至指定大小。

       使用函数
                  int AG_ScaleSurface(AG_Surface ss, Uint16 w, Uint16 h, AG_Surface *ds);
       ss为需要处理的图片,w、h表示按照宽为w,高为h来处理图片,ds为处理后的图片。
       /压缩或放大任意图片到指定大小/
     SDL_Surface ProcessScaled(AG_Pixmap px,AG_Surface *su,int surface_name)
     {
                 unsigned int w,h;
          char path[1024];
                 printf("get Scaled now -----\n");
          w = 320;
                  h = 240;
          SDL_Surface *scaled = NULL;
          if(AG_ScaleSurface(su,w,h,&scaled) == -1)
                 {
                  AG_FatalError(NULL);
                 }
                 printf("get Scaled End\n") ;
          return scaled;

     }

相关文章
|
6月前
|
异构计算
[笔记]音视频学习之SDL篇《十》绘制矩形,线条
[笔记]音视频学习之SDL篇《十》绘制矩形,线条
|
JavaScript Linux 开发者
SDL文字显示
SDL本身没有显示文字功能,它需要用扩展库SDL_ttf来显示文字。ttf是TrueTypeFont的缩写,ttf是Windows下的缺省字体,它有美观,放大缩小不变形的优点,因此广泛应用很多场合。
257 0
|
开发工具 Windows
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
|
存储 缓存 内存技术
SDL开发笔记(二):音频基础介绍、使用SDL播放音频
SDL开发笔记(二):音频基础介绍、使用SDL播放音频
SDL开发笔记(二):音频基础介绍、使用SDL播放音频
|
5G API 算法
33.FFmpeg+OpenGLES+OpenSLES播放器实现(七.FFmpeg像素格式转换和音频重采样)
项目源码FFmpeg开发文档 像素格式转换 像素格式描述了像素数据存储所用的格式。定义了像素在内存中的编码方式。FFmpeg支持的像素格式主要是rbg和yuv两种,具体可以在结构体AVPixelFormat中看到 /** * Pixel format.
1943 0
|
缓存 编解码 C语言
SDL音频播放
gcc -o tutorial03 tutorial03.c -lavutil -lavformat -lavcodec -lz -lm \`sdl-config --cflags --libs`AUDIO名词解释:samples:采样,通过PCM来采样,通常样本16bit,PCM的采样精度从14-...
847 0
|
C语言 Windows Linux
SDL显示文字
<p style="color: rgb(73, 73, 73); font-family: Arial; font-size: 14px; line-height: 22px; background-color: rgb(244, 237, 227); margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> 前面教程里,我们只显
1587 0
|
存储 API C++
最简单的视音频播放示例7:SDL2播放RGB/YUV
本文记录SDL播放视频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API用于播放视频;封装了DirectSound这类的API用于播放音频。
2193 0