将透明的.PNG图像模糊到屏幕上

时间:2010-12-13 04:53:15

标签: c++ gcc transparency sdl background-image

你好,我有一个图像,上面画着黑色矩形,背景是透明的。此文件保存为png(clear.png)。然后我有另一个图像,它只是一个保存为jpeg(background.jpeg)的纯红色背景。我试图做的是使clear.png中的黑色矩形显示在纯红色背景图像的顶部。

这就是我所做的......

/*Transparent image*/
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
    SDL_Surface *screen = NULL;
    SDL_Surface *background = NULL;
    SDL_Surface *transparentimage = NULL;

    if ( SDL_Init(SDL_INIT_EVERYTHING) == -1){
        cout <<"could not start sdl" << endl;
    }

    screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
    if ( screen == NULL){
        cout<<"could not create the screen" << endl;
    }

    background = IMG_Load("background.jpeg");
    if ( background == NULL){
        cout<<"could not load background" << endl;
    }

    transparentimage = IMG_Load("clear.png");
    if ( transparentimage == NULL){
        cout<< "could not load transparentimage" << endl;
    }

    if ( SDL_BlitSurface(background,NULL,screen,NULL) == -1 ){
        cout<<"Couldnt do background blitting " << endl;
    }
    if (SDL_BlitSurface(transparentimage,NULL,background,NULL) == -1 ){
        cout<<"could not do clear image blitting "<< endl;
    }

    SDL_Flip(screen);
    SDL_Delay(5000);

    SDL_FreeSurface(background);
    SDL_FreeSurface(transparentimage);

    SDL_Quit();

    return 0;
}

以上不起作用,它只是向我显示屏幕底部有红色背景和黑色页脚的屏幕(这不是我的矩形:))。我在这做错了什么?此外,图像的大小相同(640x480)。

1 个答案:

答案 0 :(得分:7)

确保初始化SDL_image并将两个位图blit到屏幕:

/*Transparent image*/
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
    SDL_Surface *screen = NULL;
    SDL_Surface *background = NULL;
    SDL_Surface *transparentimage = NULL;

    if ( SDL_Init(SDL_INIT_EVERYTHING) == -1){
        cout <<"could not start sdl" << endl;
    }

    screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
    if ( screen == NULL){
        cout<<"could not create the screen" << endl;
    }

    int flags = IMG_INIT_JPG | IMG_INIT_PNG;
    int initted=IMG_Init(flags);
    if( initted & flags != flags) {
        cout<<"could not init SDL_Image" << endl;
        cout<<"Reason: " << IMG_GetError() << endl;
    }

    background = IMG_Load("red.jpg");
    if ( background == NULL){
        cout<<"could not load background" << endl;
    }

    transparentimage = IMG_Load("green.png");
    if ( transparentimage == NULL){
        cout<< "could not load transparentimage" << endl;
    }

    if ( SDL_BlitSurface(background,NULL,screen,NULL) == -1 ){
        cout<<"Couldnt do background blitting " << endl;
    }
    if (SDL_BlitSurface(transparentimage,NULL,screen,NULL) == -1 ){
        cout<<"could not do clear image blitting "<< endl;
    }

    SDL_Flip(screen);
    SDL_Delay(5000);

    SDL_FreeSurface(background);
    SDL_FreeSurface(transparentimage);

    SDL_Quit();

    return 0;
}

screenshot