博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
提供了SDL非常多的基础功能、包括画线画圆各种函数包和缩放图形!
阅读量:6849 次
发布时间:2019-06-26

本文共 2829 字,大约阅读时间需要 9 分钟。

可以在这里下载:

名为SDL_gfx、这里是它的API文档

 

当然吗如果迩仅仅是需要缩放的话而不需要其它功能也可以自己写个简单的缩放图形的函数、这里是

 

这里提供完整的缩放代码:

Uint32 ReadPixel(SDL_Surface *surface, int x, int y){    int bpp = surface->format->BytesPerPixel;    /* Here p is the address to the pixel we want to retrieve */    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;    switch(bpp) {    case 1:        return *p;        break;    case 2:        return *(Uint16 *)p;        break;    case 3:        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)            return p[0] << 16 | p[1] << 8 | p[2];        else            return p[0] | p[1] << 8 | p[2] << 16;        break;    case 4:        return *(Uint32 *)p;        break;    default:        return 0;       /* shouldn't happen, but avoids warnings */    }}void DrawPixel(SDL_Surface *surface, int x, int y, Uint32 pixel){    int bpp = surface->format->BytesPerPixel;    /* Here p is the address to the pixel we want to set */    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;    switch(bpp) {    case 1:        *p = pixel;        break;    case 2:        *(Uint16 *)p = pixel;        break;    case 3:        if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {            p[0] = (pixel >> 16) & 0xff;            p[1] = (pixel >> 8) & 0xff;            p[2] = pixel & 0xff;        } else {            p[0] = pixel & 0xff;            p[1] = (pixel >> 8) & 0xff;            p[2] = (pixel >> 16) & 0xff;        }        break;    case 4:        *(Uint32 *)p = pixel;        break;    }}SDL_Surface* SDL_ScaleSurface(SDL_Surface *Surface, Uint16 Width, Uint16 Height){      SDL_Surface *_ret = SDL_CreateRGBSurface(Surface->flags, Width, Height, Surface->format->BitsPerPixel,        Surface->format->Rmask, Surface->format->Gmask, Surface->format->Bmask, Surface->format->Amask);     double    _stretch_factor_x = (static_cast
(Width) / static_cast
(Surface->w)), _stretch_factor_y = (static_cast
(Height) / static_cast
(Surface->h)); for(Sint32 y = 0; y < Surface->h; y++) //Run across all Y pixels. for(Sint32 x = 0; x < Surface->w; x++) //Run across all X pixels. for(Sint32 o_y = 0; o_y < _stretch_factor_y; ++o_y) //Draw _stretch_factor_y pixels for each Y pixel. for(Sint32 o_x = 0; o_x < _stretch_factor_x; ++o_x) //Draw _stretch_factor_x pixels for each X pixel. DrawPixel(_ret, static_cast
(_stretch_factor_x * x) + o_x, static_cast
(_stretch_factor_y * y) + o_y, ReadPixel(Surface, x, y)); return _ret;}

最后迩只需要简单的调用SDL_ScaleSurface就可以了、这个代码的实现非常的简单、先输入长宽、然后计算输出的表面长宽比、如果是小于的话、就两个像素变成一个像素、如果是大于原来的表面的话、就复制两个像素代表原来的一个像素、总的来说就是这样子吧其中返回的是计算后的生成的表面、如果原来的表面没有用的话、赶紧使用SDL_FreeSurface释放掉它吧、不然又要占内存空间了、这里还依赖了两个函数写像素和读像素

 

原文链接:

 

转载地址:http://jgoul.baihongyu.com/

你可能感兴趣的文章
初入android驱动开发之字符设备(一)
查看>>
外网上传到NAS速度很慢是什么情况?上行1M都不到,但是测试有4M
查看>>
ASP.NET Core 中使用 GrayLog 记录日志
查看>>
RabbitMQ的几种工作模式
查看>>
关于Java类加载双亲委派机制的思考(附一道面试题)
查看>>
java中关于volatile的理解疑问?
查看>>
SQL Server Management Studio(SSMS)的使用与配置整理
查看>>
Activit工作流学习例子
查看>>
解决bash: mysql: command not found 的方法
查看>>
CMakeLists
查看>>
XamarinSQLite教程Xamarin.Android项目添加引用
查看>>
Hystrix是如何工作的
查看>>
java 上传图片压缩图片
查看>>
微信小程序 - 上传图片纯前端(多张、单张)
查看>>
【满额赠书】满58赠书1册,满88再赠书1册
查看>>
AutoCAD Plant 3D
查看>>
Linux tcpdump命令详解
查看>>
SHA-1 vs SHA-256
查看>>
Java访问Url地址并下载文件
查看>>
I.MX6 默认打开 USB adb
查看>>