轻量级前端框架助力开发者提升项目效率与性能
969
2022-08-27
SDL点、线、面及图像加载
SDL画图系列之点,线,面
点
SDL库并没有提供直接画点的函数。不过在开发文档中提供了一个在任意视频模式下画出一个像素点的例子。我们可以写自己的画点函数。 有了画点函数意义非凡,我们可以使用它加上数学中美丽的方程绘出各种各样惊艳的图案。比如蝴蝶曲线啥的。这里简单的绘制一个点,主要用于说明使用。
#include
结果:在屏幕上绘制一个白点。 不过,在SDL_draw库中倒是存在着基本的绘画函数,我们包含相应的头文件,然后调用库函数即可,连接时加上选项-lSDL_draw 添加代码:
#include
这种现象很有意思,为什么自定义画点函数不需要更新,但是SDL_draw库的Draw_Pixel函数需要更新呢?两者的内容不一样? 话说回来,怎么查看void Draw_Pixel(SDL_Surface *super, Sint16 x, Sint16 y, Uint32 color);的具体实现啊。
线
简单应用SDL_draw库即可,它提供了函数void Draw_Line(SDL_Surface *super, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color);,我们可以在SDL_draw-1.2.13/./doc/index.html 查看相关的说明。当然我们也可以书写自己的函数。这里直接用库函数简单体验。
#include
shell> gcc drawLine.c -lSDL -lSDL_draw -o drawLineshell> ./drawLine
面
对于面而言,图形很多啊,矩形,圆形,不规则多边形等等。
void Draw_Circle(SDL_Surface *super, Sint16 x0, Sint16 y0, Uint16 r,Uint32 color);void Draw_FillCircle(SDL_Surface *super, Sint16 x0, Sint16 y0, Uint16 r, Uint32 color);void Draw_HLine(SDL_Surface *super,Sint16 x0,Sint16 y0, Sint16 x1, Uint32 color);void Draw_VLine(SDL_Surface *super, Sint16 x0,Sint16 y0, Sint16 y1, Uint32 color);void Draw_Rect(SDL_Surface *super, Sint16 x,Sint16 y, Uint16 w,Uint16 h, Uint32 color);void Draw_FillRect(SDL_Surface *super, Sint16 x,Sint16 y, Uint16 w,Uint16 h, Uint32 color);void Draw_Ellipse(SDL_Surface *super, Sint16 x0, Sint16 y0, Uint16 Xradius, Uint16 Yradius, Uint32 color);void Draw_FillEllipse(SDL_Surface *super, Sint16 x0, Sint16 y0, Uint16 Xradius, Uint16 Yradius, Uint32 color);void Draw_Round(SDL_Surface *super, Sint16 x0,Sint16 y0, Uint16 w,Uint16 h, Uint16 corner, Uint32 color);void Draw_Round(SDL_Surface *super, Sint16 x0,Sint16 y0, Uint16 w,Uint16 h, Uint16 corner, Uint32 color);
在SDL_draw库文件夹中,有一个sdldrawtest.c的文件,我们编译连接,可以发现多边形的效果。
root@ubuntu1:/home/edemon/SDL_draw-1.2.13# gcc sdldrawtest.c -o sdlTest -lSDL -lSDL_drawroot@ubuntu1:/home/edemon/SDL_draw-1.2.13# ./sdlTest
SDL之加载图像
在博文linux图形编程之SDL中,我们使用SDL库函数SDL_LoadBMP(const char *)加载过图片,但是这局限于BMP图片,有其他的方法来处理更多格式的图片吗? SDL有许多的开发库,比如:
库 | 作用 |
SDL | 基本库 |
SDL_image | 图像库 |
SDL_mixer | 混音库 |
SDL_net | 网路库 |
SDL_ttf | TrueType字体库 |
我们想要的方案就在图象库中。 SDL_image支持的图像格式:BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV。 -SDL_image-1.2.2.tar.gz,网址: 然后解压,进入文件夹后,安装三部曲,./configure; make; make install 安装的时候Linux最好联网,我在不联网的情况下安装时,jpglib库就没能正常安装。 安装过程中有这样的信息:
chmod 644 /usr/local/lib/libSDL_image.aPATH="$PATH:/sbin" ldconfig -n /usr/local/lib----------------------------------------------------------------------Libraries have been installed in: /usr/local/lib.../bin/sh ./mkinstalldirs /usr/local/bin /bin/sh ./libtool --mode=install /usr/bin/install -c showimage /usr/local/bin/showimage/usr/bin/install -c .libs/showimage /usr/local/bin/showimage/bin/sh ./mkinstalldirs /usr/local/include/SDL /usr/bin/install -c -m 644 SDL_image.h /usr/local/include/SDL/SDL_image.hmake[1]: Leaving directory '/home/edemon/SDL_image-1.2.2'
为以后的方便编译连接,直接将/usr/local/lib下的image的相关文件复制到/usr/lib下。
shell> cd /usr/local/libshell> sudo cp *image* /usr/lib/
头文件复制到/usr/include下:edemon@ubuntu1:~/SDL_image-1.2.2$ sudo cp SDL_image.h /usr/include/ 我们可以看到他和/usr/local/include/SDL下的SDL_image.h是没有区别的。 edemon@ubuntu1:/usr/local/include/SDL$ diff SDL_image.h /home/edemon/SDL_image-1.2.2/SDL_image.h 在同样的操作步骤后,我不明白,为什么SDL基本库可以通过man来查阅函数,但是SDL_image库中的函数就不能。 接下来,我们使用函数IMG_LOAD()来加载一张png图片。 cat LoadPic.c
#include
shell> gcc LoadPic.c -lSDL -lSDL_imageshell> ./a.out
在我的ubuntu上始终不支持JPG(JPEG)啊,坑了我一晚上。这是为什么,我的代码有问题?
自己将LoadPic.c中加载png图片改成加载jpg图片。
./a.out IMG_Load error Unsupported image format
在SDL_image文件夹中查看源码IMG_jpg.c,我们发现函数SDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src)在#ifdef LOAD_JPG代码区间内,于是预先定义LOAD_JPG,在主函数外添加#define LOAD_JPG,还是一样的效果。 那么我就使用安装生成的showimage进行测试,发现这样仍然有这样的提示信息:Unsupported image format
shell> /usr/local/bin/showimage /home/edemon/Pictures/sum.jpg Couldn't load /home/edemon/Pictures/sum.jpg: Unsupported image format
先记着吧。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~