【发布时间】:2008-11-30 05:43:32
【问题描述】:
缩放 SDL 表面的正确方法是什么?我在网上找到了一个解释,但它需要逐个像素地重绘 Surface。似乎应该有某种方式通过 SDL 本地执行此操作,而不是像那样重绘图像。我无法在涵盖此内容的 SDL 文档中找到任何内容。我可以通过修改表面的宽度和高度来毫无问题地调整表面的大小,但生成的表面会被剪裁。
【问题讨论】:
缩放 SDL 表面的正确方法是什么?我在网上找到了一个解释,但它需要逐个像素地重绘 Surface。似乎应该有某种方式通过 SDL 本地执行此操作,而不是像那样重绘图像。我无法在涵盖此内容的 SDL 文档中找到任何内容。我可以通过修改表面的宽度和高度来毫无问题地调整表面的大小,但生成的表面会被剪裁。
【问题讨论】:
我知道这个答案太迟了,无法帮助提出这个问题的人,但我决定写这个来帮助任何偶然发现这个问题的人。在 SDL 2.0 中,您可以使用 SDL_BlitScaled() 函数将表面缩放为目标 SDL_Rect。 LazyFoo 的教程对此进行了描述,或查看此 documentation。
【讨论】:
SDL 不支持缩放位传输。根据SDL_BlitSurface的文档:
注意:SDL blitter 不(还) 具有缩放的能力 像这样向上或向下涂抹表面 与其他更复杂的情况 位机制。你必须 如果你自己想办法 你想缩放图像(例如使用 SDL_gfx)。
您可以找到 SDL_gfx here。编写自己的 blitting 函数并没有那么糟糕,它可能是一个有趣且有用的学习实验(尽管你会重新发明轮子)。使用 OpenGL 也是一种选择,因为像缩放和旋转这样的事情可以在一个函数调用中完成。
【讨论】:
为了完整起见,并且由于问题未指定 SDL 版本,因此可以在 SDL2 中使用 API 方法 SDL_RenderCopyEx 进行缩放。除了基本的 SDL2 库之外,不需要额外的库。
int SDL_RenderCopyEx(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect,
const double angle,
const SDL_Point* center,
const SDL_RendererFlip flip)
通过设置dstrect 的大小,可以将纹理缩放到整数个像素。也可以同时旋转和翻转纹理。
从技术上讲,这不是缩放表面,而是缩放纹理。尽管在基于 SDL2 的应用程序中进行渲染之前,表面几乎总是被转换为纹理,但该过程应该是相关的。
参考:https://wiki.libsdl.org/SDL_RenderCopyEx
像往常一样创建纹理:
surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);
当需要渲染它时,调用SDL_RenderCopyEx 而不是SDL_RenderCopy
【讨论】: