不裁剪地缩放SDL表面的正确方法是什么?

8

如何正确地缩放SDL表面?我在网上找到了一个解释,但它需要逐像素重新绘制表面。似乎应该有一些通过SDL本身实现而不是像那样重新绘制图像的方法。我在SDL文档中没有找到涵盖此内容的任何信息。我可以通过修改表面的宽度和高度轻松地调整表面大小,但结果表面被裁剪。

3个回答

8

我知道这个回答来得太晚了,无法为提问者提供帮助,但我决定写下这篇文章,以帮助那些偶然遇到这个问题的人。在SDL 2.0中,您可以使用SDL_BlitScaled()函数将一个表面缩放到目标SDL_Rect中。有一份由LazyFoo编写的教程描述了这一点,或者查看此文档


7
SDL不支持缩放贴图。根据SDL_BlitSurface的文档:
注意:SDL blitter还没有像其他更复杂的blitting机制那样具有缩放所需的功能。如果要缩放图像(例如使用SDL_gfx),您必须自己想出解决方案。
您可以在此处找到SDL_gfx编写自己的blitting函数并不困难,这可能是一次有趣且有用的学习实验(尽管您会重新发明轮子)。另一个选择是使用OpenGL,因为诸如缩放和旋转之类的内容可以在单个函数调用中完成。

1

为了完整性,因为问题没有指定SDL版本,可以使用API方法SDL_RenderCopyEx在SDL2中进行缩放。除了基本的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接