SDL图像显示

       计算机屏幕上的图像是由一个一个点组成的,不同颜色的点集合在一起,就构成了一幅图片。在屏幕上显示图像,就是对每一个像素点进行着色。首先我们对图片进行分析,取出每一个点的像素, 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_image-1.2.10.tar.tar,只需按照《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);

        Jpegpng图片显示

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

        首先是把SDL_LoadBMP改成IMG_Load

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

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

        #include

        SDL_Surface*screen,*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;

     }



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Ubuntu上使用SDL显示图片,你需要进行以下步骤: 1. 安装SDL库:首先,确保你已经安装了SDL库。可以使用以下命令在Ubuntu上安装: ``` sudo apt-get install libsdl2-dev ``` 2. 初始化SDL:在你的代码中,首先需要初始化SDL。你可以在程序的开始处调用`SDL_Init`函数来初始化SDL。例如: ```c if (SDL_Init(SDL_INIT_VIDEO) != 0) { printf("SDL initialization failed: %s\n", SDL_GetError()); return 1; } ``` 3. 创建窗口和渲染器:在初始化SDL后,你需要创建一个窗口和一个渲染器来显示图片。你可以使用`SDL_CreateWindow`函数创建一个窗口,并使用`SDL_CreateRenderer`函数创建一个渲染器。例如: ```c SDL_Window* window = SDL_CreateWindow("Image Display", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN); if (window == NULL) { printf("Window creation failed: %s\n", SDL_GetError()); return 1; } SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); if (renderer == NULL) { printf("Renderer creation failed: %s\n", SDL_GetError()); return 1; } ``` 4. 加载图片并创建纹理:使用SDL_image库加载图片,并将其转换为纹理以供渲染。你需要安装SDL_image库,并在代码中包含相应的头文件。例如,加载一张名为"image.png"的图片并创建纹理: ```c #include <SDL2/SDL_image.h> SDL_Surface* surface = IMG_Load("image.png"); if (surface == NULL) { printf("Image loading failed: %s\n", IMG_GetError()); return 1; } SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); if (texture == NULL) { printf("Texture creation failed: %s\n", SDL_GetError()); return 1; } ``` 5. 渲染纹理:最后,你可以在主循环中使用`SDL_RenderCopy`函数将纹理渲染到窗口上。例如,将纹理渲染到整个窗口: ```c SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); ``` 6. 释放资源:在程序结束时,记得释放已分配的资源。例如,释放纹理、渲染器和窗口: ```c SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); ``` 这就是在Ubuntu上使用SDL显示图片的基本步骤。你可以根据自己的需求进行更多的操作和调整。如果你有其他问题,请提供更多的细节,我将尽力帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒号华仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值