delphi JPG或BMP图片透明显示 delphi jpg to bmp
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;
end;
更多阅读
ati显卡双屏设置 amd显卡怎么设置双屏
ati显卡双屏设置——简介双屏显示为增加显示空间、提高工作效率提供了可能(如图)。只要不是很老的显卡,都支持双头、甚至多头输出。“头”的类型包括:VGA、DVI、HDMI等。通过下载官方或整机厂商提供的驱动程序、设置程序,可以很方便地设
网页验证码无法显示如何处理 网页验证码图片不显示
网页验证码无法显示如何处理——简介在我们打开含有验证码的网页时,验证码图片没有显示或很慢才显示出来、需要刷新几次才能够显示出来,这可能原因为Internet选项设置了禁用控件、Internet选项设置阻挡所有网站cookies、Internet选项
桌面图标显示不正常怎么办?快速恢复不正常图标 win7快速显示桌面图标
桌面图标显示不正常怎么办?快速恢复不正常图标——简介由于程序下载的种种问题,或电脑分辨率的问题,应用程序图标或文件图标会显示不正常,像下图一样。有时候会莫名其妙的不正常,不知道原因出在哪,不知道原因不要紧,知道怎么恢复就行了
十二宫位各自含义之第十二宫“玄秘宫”_Lee 十二宫含义
第十二宫“玄秘宫”,本来是双鱼座的固定位置。由于奉献牺牲是双鱼座展现的人生方式之一,所以第十二宫代表一个人本身未知的力量或弱点,它显示一个人的秘密、潜意识、直觉力、秘密敌人等。在时势占星学里,它代表的是“福利宫”。太阳在
图片加透明FLASH一 flash怎么让图片透明
图片加透明FLASH一层透明Flash的效果: