我正在尝试使用 android SDL 2.0,但是我遇到了一个我无法解决的问题。我的问题是我试图制作一张 1080*1920 的图片作为我的应用程序的背景。我在 photoshop 中创建它,但每当我尝试在我的手机上启动该应用程序时,图像质量都要差得多。
这是一个例子。你无法在图片上真正看到它有多糟糕,但在我的手机屏幕上看,它更糟糕:
我使用的代码:
int main(int argc, char *argv[])
{
int w, h;
KEP kep;
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Surface *surface;
SDL_CreateWindowAndRenderer(0, 0, 0, &window, &renderer);
SDL_GetWindowSize(window, &w, &h);
surface = IMG_Load("hatter.png");
kep.w = w;
kep.h = h;
kep.texture=SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
SDL_Rect destination={0, 0, kep.w, kep.h};
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, kep.texture, NULL, &destination);
SDL_RenderPresent(renderer);
return 0;
}
“kep”只是一个包含图片的纹理、宽度和高度的结构,之前声明过。我现在正在使用 SDL_image 扩展,但它也不适用于 SDL_LoadBMP()
。
我该怎么做才能避免质量如此差?
非常感谢!
最佳答案
我最近回答了类似的问题,应该也有助于解决这个问题;这是:
首先确保图像是小文件类型格式,如“PNG”。其次,当 blitting 图像时,请确保您没有将透明颜色添加到背景图像,因为它毫无意义并且会占用大量 cpu 周期。这是我很久以前编写的代码示例,作为图像加载的包装器
SDL_Surface* altSDL::load_image(std::string filename)
{
SDL_Surface* loadedImage = NULL;
SDL_Surface* optimizedImage = NULL;
loadedImage = IMG_Load( filename.c_str() );
if( loadedImage != NULL )
{
optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );
}
else
{
Failure* fail;
fail = Failure::getInstance();
fail->failLog(filename);
}
if( optimizedImage != NULL )
{
Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF );
SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
}
return optimizedImage;
}
在此代码中,您将能够将所有图像传递到其中以进行非常无缝的优化,但在背景/大图像的情况下,您需要确保将最后一段代码更改为更多内容像这样的行:
//Added some Sudo code
if( loadedImage != NULL && !isBigImage)
{
optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );
}
else if(!isBigImage)
{
Failure* fail;
fail = Failure::getInstance();
fail->failLog(filename);
}
isBigImage是我添加的sudo代码,是传入的参数;在某些情况下。这将使您的所有图像都经过优化,变小(应确保它们是 png 文件),并且将使透明度仅添加到小图像文件中,这样您的背景就不会解决您的 fps
关于Android with SDL 2.0,设置图片为背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28564185/