delphi JPG或BMP图片透明显示 delphi jpg to bmp

时间:2011-6-2来源:yang 作者: peng点击: 32次

procedure SaveBmpAsIcon(const Bmp: TBitmap; const Icon: string; const SmallIcon: Boolean;

const Transparent: Boolean; const X, Y: Integer);

// Bmp : Bitmap图片

// Icon : 最终输出的icon文件全路径和文件名。如果文件已经存在则会将其覆盖

// SmallIcon : True: 16x16 图标, False: 32x32 图标

// Transparent: 确定是否按照参数X,Y的坐标色生成透明图标

// X, Y : 此参数指明坐标下的色值将会作为透明色替换全图

var

PBI, MPBI: PBitmapInfo;

IHS, MIHS, ImageSize, MImageSize: DWord;

bmBuffer, MaskBuffer: Pointer;

TID: TIconDir;

TBIH: TBitmapInfoHeader;

Bmx, Bmm: TBitmap;

TranspCol: TColor;

I, J: Integer;

begin

Bmx:= TBitmap.Create;

Bmm:= TBitmap.Create;

try

if SmallIcon then

begin

Bmx.Width:= GetSystemMetrics(SM_CXSMICON);

Bmx.Height:= GetSystemMetrics(SM_CYSMICON);

end

else

begin

Bmx.Width:= GetSystemMetrics(SM_CXICON);

Bmx.Height:= GetSystemMetrics(SM_CYICON);

end;

bmx.pixelformat:=pf24bit;

Bmx.Canvas.StretchDraw(Rect(0, 0, Bmx.Width, Bmx.Height), Bmp);

TranspCol:= Bmx.Canvas.Pixels[X, Y];

//TranspCol:= clWhite;

Bmm.Assign(Bmx);

Bmm.Mask(TranspCol);

GetDIBSizes(Bmm.Handle, MIHS, MImageSize);

GetDIBSizes(Bmx.Handle, IHS, ImageSize);

MaskBuffer:= AllocMem(MImageSize);

bmBuffer:= AllocMem(ImageSize);

MPBI:= AllocMem(MIHS);

PBI:= AllocMem(IHS);

try

if Transparent then

begin

for I:=0 to Bmx.Width-1 do

for J:=0 to Bmx.Height-1 do

if Bmx.Canvas.Pixels[I, J] = TranspCol then Bmx.Canvas.Pixels[I, J]:= 0;

with MPBI^.bmiHeader do

begin

biSize:= SizeOf(TBitmapInfoHeader);

biWidth:= Bmm.Width;

biHeight:= Bmm.Height;

biPlanes:= 1;

biBitCount:= 1;

biCompression:= BI_RGB;

biSizeImage:= MImageSize;

biXPelsPerMeter:= 0;

biYPelsPerMeter:= 0;

biClrUsed:= 2;

biClrImportant:= 2;

end;

GetDIBits(Bmm.Canvas.Handle, Bmm.Handle, 0, Bmm.height, MaskBuffer, MPBI^, DIB_RGB_COLORS);

end;

with PBI^.bmiHeader do

begin

biSize:= SizeOf(TBitmapInfoHeader);

biWidth:= Bmx.Width;

biHeight:= Bmx.Height;

biPlanes:= 1;

biBitCount:= 24;

biCompression:= BI_RGB;

biSizeImage:= ImageSize;

biXPelsPerMeter:= 0;

biYPelsPerMeter:= 0;

biClrUsed:= 0;

biClrImportant:= 0;

end;

GetDIBits(Bmx.Canvas.Handle, Bmx.Handle, 0, Bmx.Height, bmBuffer, PBI^, DIB_RGB_COLORS);

with TBIH do

begin

biSize:= 40;

biWidth:= Bmx.Width;

biHeight:= Bmx.Height * 2;

biPlanes:= 1;

biBitCount:= 24;

biCompression:= 0;

biSizeImage:= ImageSize;

biXPelsPerMeter:= 0;

biYPelsPerMeter:= 0;

biClrUsed:= 0;

biClrImportant:= 0;

end;

with TID do

begin

idReserved:=0;

idType:=1;

idCount:=1;

with idEntries[1] do

begin

bWidth:=bmx.width;

bHeight:=bmx.height;

bColorCount:=0;

bReserved:=0;

wPlanes:=1;

wBitCount:=24;

dwBytesInRes:= SizeOf(TBitmapInfoHeader) + TBIH.biSizeImage + MImageSize;

dwImageOffset:= 6 + TID.idCount * SizeOf(TIconDirEntry);

end;

end;

with TFileStream.Create(Icon, fmCreate) do

try

Write(TID, 6 + TID.idCount * SizeOf(TIconDirEntry));

Write(TBIH, SizeOf(TBitmapInfoheader));

Write(bmBuffer^, TBIH.biSizeImage);

Write(maskBuffer^, MImageSize);

finally

Free;

end;

finally

FreeMem(MaskBuffer);

FreeMem(bmBuffer);

FreeMem(MPBI);

FreeMem(PBI);

end;

finally

Bmx.free;

Bmm.free;

end;

delphi JPG或BMP图片透明显示 delphi jpg to bmp
end;

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/100947.html

更多阅读

ati显卡双屏设置 amd显卡怎么设置双屏

ati显卡双屏设置——简介双屏显示为增加显示空间、提高工作效率提供了可能(如图)。只要不是很老的显卡,都支持双头、甚至多头输出。“头”的类型包括:VGA、DVI、HDMI等。通过下载官方或整机厂商提供的驱动程序、设置程序,可以很方便地设

网页验证码无法显示如何处理 网页验证码图片不显示

网页验证码无法显示如何处理——简介在我们打开含有验证码的网页时,验证码图片没有显示或很慢才显示出来、需要刷新几次才能够显示出来,这可能原因为Internet选项设置了禁用控件、Internet选项设置阻挡所有网站cookies、Internet选项

十二宫位各自含义之第十二宫“玄秘宫”_Lee 十二宫含义

第十二宫“玄秘宫”,本来是双鱼座的固定位置。由于奉献牺牲是双鱼座展现的人生方式之一,所以第十二宫代表一个人本身未知的力量或弱点,它显示一个人的秘密、潜意识、直觉力、秘密敌人等。在时势占星学里,它代表的是“福利宫”。太阳在

声明:《delphi JPG或BMP图片透明显示 delphi jpg to bmp》为网友黑桃先生分享!如侵犯到您的合法权益请联系我们删除