您的当前位置:首页正文

基于graphics的透明贴图方法

2021-04-27 来源:客趣旅游网


Image类提供了两种方法输入和保存图像

① 输入2个图片路径,第一个是原图,第二个是精灵图。使用这种方法时,请确保原图的透明区域为黑色,而精灵图的非透明部分为黑色、透明区域为白色。

② 输入1个图片路径和1个真假值决定这个Image是否具有透明区域。当你想使用这种方法自动生成透明区域时,可以统一使用任意一种颜色作为透明色,但该图片的第一个像素(即左上角的像素)必须为该透明色。

///////////////////////////代码部分///////////////////////////////////

#include

class Image{

public:

IMAGE imgA;

IMAGE imgB;

bool haveTransparentArea;

public:

Image(){}

Image(LPCTSTR strA,LPCTSTR strB){

loadimage(&imgA,strA);

loadimage(&imgB,strB);

haveTransparentArea=true;

}

Image(LPCTSTR strA,bool haveTransparentArea1){

loadimage(&imgA,strA);

haveTransparentArea=haveTransparentArea1;

if(haveTransparentArea){

imgB=imgA;

DWORD* pa = GetImageBuffer(&imgA);

DWORD* pb = GetImageBuffer(&imgB);

COLORREF c=pa[0];

int w = imgA.getwidth();

int h = imgA.getheight();

for (int i=1; iif (c == pa[i]){

pb[i] = WHITE;

pa[i] = BLACK;

}

else {

pb[i] = BLACK;

}

}

pa[0]=BLACK;

pb[0]=WHITE;

}

}

};

inline void putimage(int x,int y,const Image* image){

if (image->haveTransparentArea){

putimage(x-image->imgA.getwidth()/2,y-image->imgA.getheight()/2,&image->imgB,SRCAND);

putimage(x-image->imgA.getwidth()/2,y-image->imgA.getheight()/2,&image->imgA,SRCPAINT);

}

else

putimage(x-image->imgA.getwidth()/2,y-image->imgA.getheight()/2,&image->imgA);

}

///////////////////////////代码部分///////////////////////////////////

///////////////////////////示例代码部分///////////////////////////////////

int main(){

initgraph(800, 640);

Image* background= new Image(_T(\"picture\\\\background.bmp\") ,false);

Image* stg1= new Image(_T(\"picture\\\\stg.bmp\") ,true);

Image* stg2=

new Image(_T(\"picture\\\\stg.bmp\")

,_T(\"picture\\\\stg_a.jpg\"));

putimage(400,320,background);

putimage(800/3,320,stg1);

putimage(800/3*2,320,stg2);

getch();//请自行添加#include

return 0;

}

///////////////////////////示例代码部分///////////////////////////////////

示例图片素材:

background

Stg

stg_a

示例代码运行结果

因篇幅问题不能全部显示,请点此查看更多更全内容