SDL2 (C++) 如何使图像变小

SDL2 (C++) How to render an image smaller

本文关键字:图像 何使 C++ SDL2      更新时间:2023-10-16

我终于开始习惯 SDL 2 的基本渲染功能,我偶然发现了一个我相信公众可能能够回答的问题。在我的代码中,我生成了一些文本并使用教程中的一些代码,能够将文本加载为纹理(即 Lazy foo 的教程(。此纹理现在具有基于字体大小和输入文本量的宽度和高度。另一个功能是,我在一个由花哨的边界制成的正方形中使用负载,我希望将其用作菜单。这个正方形是200x200。例如,如果文本纹理为 100x160,我希望正方形现在渲染为 120x180 图像(实质上是将其压缩为与文本纹理相似的大小。

tl;博士:

我有 200x200 正方形。

我有 100x160 文本纹理

我想将 200x200 正方形渲染为 120x160 正方形,并在正方形内渲染 100x160 文本。

loadFromRenderedText 采用 ttf 字体、字符串和颜色 (RGBA( 来创建基于字符串的图像纹理 ->生成自己的宽度/高度

menuTextTexture.loadFromRenderedText(menuFont, "Info Item Skill Back",menuTextColor);
menuSize.x = 0;
menuSize.y = 0;
menuSize.w = menuTextTexture.getWidth() + boarderW;
menuSize.h = menuTextTexture.getHeight() + boarderW;

菜单大小是一个SDL_Rect

menuBoxTexture.TextRender(XmenuRenderLocX, XmenuRenderLocY,  &menuSize, 0, NULL, SDL_FLIP_NONE);
menuTextTexture.render(XmenuRenderLocX+boarderW, XmenuRenderLocY+boarderW);

TextRender 和渲染做同样的事情,除了渲染使用比例因子将剪辑大小乘以更大(我将其留空 ->剪辑为 NULL 并使用基本高度/宽度(。对于 TextRender,我通过传递 menuSize SDL rect 来指定渲染尺寸。 这采用 200x200 正方形,并仅渲染 (XmenuRenderLocX, XmenuRenderLocY(的正方形的 120x160...因此基本上裁剪了正方形,这不是我想要的......我想调整正方形的大小。

任何帮助将不胜感激

最初,我使用的是提供的 LTexture::render 函数,该函数是为 Lazy Foo 的教程创建的。请参阅下面的代码

void LTexture::render( int x, int y, SDL_Rect* clip, double angle, SDL_Point* center, SDL_RendererFlip flip )
{
//Set rendering space and render to screen
SDL_Rect renderQuad = { x, y, mWidth, mHeight };
//Set clip rendering dimensions
if( clip != NULL )
{
renderQuad.w = SCALE_SIZE*(clip->w);
renderQuad.h = SCALE_SIZE*(clip->h);
}
else if(mTexture ==NULL)
{
printf("Warning: Texture to Render is NULL!n");
}
//Render to screen
SDL_RenderCopyEx( gRenderer, mTexture, clip, &renderQuad, angle, center, flip );
}

但是因为直到现在我才完全理解函数的渲染方式,所以我实际上并没有告诉它以新的维度渲染(除非我用SCALE_SIZE放大所有内容(

我做了一个新功能来获得更多控制

void LTexture::DefinedRender(SDL_Rect* Textureclip, SDL_Rect* renderLocSize, double angle, SDL_Point* center, SDL_RendererFlip flip)
{
//Set clip rendering dimensions
if(mTexture ==NULL)
{
printf("Warning: Texture to Render is NULL!n");
}
//Render to screen
SDL_RenderCopyEx( gRenderer, mTexture, Textureclip, renderLocSize, angle, center, flip );
}

现在一切都像我想要的那样工作。