Android与SDL 2.0,将图片设置为背景

时间:2015-02-17 14:51:58

标签: android sdl sdl-2 blurry sdl-image

我正在尝试使用android SDL 2.0,但是我遇到了一个我无法解决的问题。我的问题是我尝试将1080 * 1920图片作为我的应用程序的背景。我在photoshop中创建它,但每当我尝试在手机上启动应用程序时,图像质量会更差。

这是一个例子。你无法真正看到图片有多糟糕,但在手机屏幕上看,情况更糟:

The picture

The picture on my phone

我正在使用的代码:

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()一起使用。

我该怎么办才能达到如此糟糕的质量?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我最近也回答了类似的问题,也应该对此有所帮助;这是:

首先请确保图像采用像“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