You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SDL2中如何调整PNG图片大小以拉伸适配640x480分辨率屏幕

问题原因

SDL_BlitSurface 本身仅支持表面区域的拷贝操作,会自动忽略目标矩形的w、h属性,仅按源矩形的尺寸拷贝内容到目标矩形的x、y坐标位置,因此无法实现拉伸效果,设置的目标尺寸不会生效,反而会因为区域不匹配出现裁切问题。

解决方案

替换拷贝函数为支持缩放的SDL_BlitScaled,同时修正源、目标矩形的参数配置:

  1. 源矩形需要匹配原始图片的实际尺寸,保证取到完整的背景图内容
  2. 目标矩形需要设置为屏幕全尺寸,实现拉伸铺满屏幕的效果

代码修正

矩形参数配置修正

int main() {
    // 源矩形:取整张背景图,坐标从左上角(0,0)起始,尺寸匹配原始图片
    surfWindRectBC.x = 0;
    surfWindRectBC.y = 0;
    surfWindRectBC.w = menu->w;
    surfWindRectBC.h = menu->h;

    // 目标矩形:覆盖整个屏幕,坐标从左上角(0,0)起始,尺寸匹配屏幕分辨率
    surfWindRectCI.x = 0;
    surfWindRectCI.y = 0;
    surfWindRectCI.w = SCREEN_WIDTH;
    surfWindRectCI.h = SCREEN_HEIGHT;
...
}

绘制逻辑修正

while (game) {
    SDL_Event event;
    Uint8 input = 0;
    
    while (SDL_PollEvent(&event)) {...}
    // 替换为支持缩放的绘制函数
    SDL_BlitScaled(current, &surfWindRectBC, screenSurf, &surfWindRectCI);
    SDL_UpdateWindowSurface(window);
}

额外注意事项

  • 你代码中提前调用SDL_CreateRGBSurface创建的current表面属于冗余操作,后续SDL_ConvertSurface返回的新表面会直接覆盖该指针,造成内存泄漏,建议删除提前创建的逻辑,直接声明SDL_Surface* current = NULL;即可。
  • 资源路径建议使用正斜杠/替代反斜杠\\,Windows环境同样可以识别,同时兼容其他操作系统。

内容的提问来源于stack exchange,提问作者Radioactive Epic Face

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:54:04