如何让有背景色的图像,背景部分变透明;就像GIF文件一样(50分)

  • 主题发起人 主题发起人 laohe
  • 开始时间 开始时间
L

laohe

Unregistered / Unconfirmed
GUEST, unregistred user!
请高手赐教
 
98/2000下, 可以直接调用transparentblt这个api实现。 nt/95下可以用delphi里带的transparentstretchblt函数实现
 
procedure DrawTransparentBitmapRect(DC: HDC; Bitmap: HBitmap; xStart, yStart,
Width, Height: Integer; Rect: TRect; TransparentColor: TColorRef);
var
{$IFDEF WIN32}
BM: Windows.TBitmap;
{$ELSE}
BM: WinTypes.TBitmap;
{$ENDIF}
cColor: TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave: HBitmap;
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: HBitmap;
hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave: HDC;
ptSize, ptRealSize, ptBitSize, ptOrigin: TPoint;
begin
hdcTemp := CreateCompatibleDC(DC);
SelectObject(hdcTemp, Bitmap); { Select the bitmap }
GetObject(Bitmap, SizeOf(BM), @BM);
ptRealSize.x := Min(Rect.Right - Rect.Left, BM.bmWidth - Rect.Left);
ptRealSize.y := Min(Rect.Bottom - Rect.Top, BM.bmHeight - Rect.Top);
DPtoLP(hdcTemp, ptRealSize, 1);
ptOrigin.x := Rect.Left;
ptOrigin.y := Rect.Top;
DPtoLP(hdcTemp, ptOrigin, 1); { Convert from device }
{ to logical points }
ptBitSize.x := BM.bmWidth; { Get width of bitmap }
ptBitSize.y := BM.bmHeight; { Get height of bitmap }
DPtoLP(hdcTemp, ptBitSize, 1);
if (ptRealSize.x = 0) or (ptRealSize.y = 0) then begin
ptSize := ptBitSize;
ptRealSize := ptSize;
end
else ptSize := ptRealSize;
if (Width = 0) or (Height = 0) then begin
Width := ptSize.x;
Height := ptSize.y;
end;

{ Create some DCs to hold temporary data }
hdcBack := CreateCompatibleDC(DC);
hdcObject := CreateCompatibleDC(DC);
hdcMem := CreateCompatibleDC(DC);
hdcSave := CreateCompatibleDC(DC);
{ Create a bitmap for each DC. DCs are required for a number of }
{ GDI functions }
{ Monochrome DC }
bmAndBack := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);
bmAndObject := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);
bmAndMem := CreateCompatibleBitmap(DC, Max(ptSize.x, Width), Max(ptSize.y, Height));
bmSave := CreateCompatibleBitmap(DC, ptBitSize.x, ptBitSize.y);
{ Each DC must select a bitmap object to store pixel data }
bmBackOld := SelectObject(hdcBack, bmAndBack);
bmObjectOld := SelectObject(hdcObject, bmAndObject);
bmMemOld := SelectObject(hdcMem, bmAndMem);
bmSaveOld := SelectObject(hdcSave, bmSave);
{ Set proper mapping mode }
SetMapMode(hdcTemp, GetMapMode(DC));

{ Save the bitmap sent here, because it will be overwritten }
BitBlt(hdcSave, 0, 0, ptBitSize.x, ptBitSize.y, hdcTemp, 0, 0, SRCCOPY);
{ Set the background color of the source DC to the color, }
{ contained in the parts of the bitmap that should be transparent }
cColor := SetBkColor(hdcTemp, TransparentColor);
{ Create the object mask for the bitmap by performing a BitBlt() }
{ from the source bitmap to a monochrome bitmap }
BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, ptOrigin.x, ptOrigin.y,
SRCCOPY);
{ Set the background color of the source DC back to the original }
{ color }
SetBkColor(hdcTemp, cColor);
{ Create the inverse of the object mask }
BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
NOTSRCCOPY);
{ Copy the background of the main DC to the destination }
BitBlt(hdcMem, 0, 0, Width, Height, DC, xStart, yStart,
SRCCOPY);
{ Mask out the places where the bitmap will be placed }
StretchBlt(hdcMem, 0, 0, Width, Height, hdcObject, 0, 0,
ptSize.x, ptSize.y, SRCAND);
{BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);}
{ Mask out the transparent colored pixels on the bitmap }
BitBlt(hdcTemp, ptOrigin.x, ptOrigin.y, ptSize.x, ptSize.y, hdcBack, 0, 0,
SRCAND);
{ XOR the bitmap with the background on the destination DC }
StretchBlt(hdcMem, 0, 0, Width, Height, hdcTemp, ptOrigin.x, ptOrigin.y,
ptSize.x, ptSize.y, SRCPAINT);
{BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, ptOrigin.x, ptOrigin.y,
SRCPAINT);}
{ Copy the destination to the screen }
BitBlt(DC, xStart, yStart, Max(ptRealSize.x, Width), Max(ptRealSize.y, Height),
hdcMem, 0, 0, SRCCOPY);
{ Place the original bitmap back into the bitmap sent here }
BitBlt(hdcTemp, 0, 0, ptBitSize.x, ptBitSize.y, hdcSave, 0, 0, SRCCOPY);

{ Delete the memory bitmaps }
DeleteObject(SelectObject(hdcBack, bmBackOld));
DeleteObject(SelectObject(hdcObject, bmObjectOld));
DeleteObject(SelectObject(hdcMem, bmMemOld));
DeleteObject(SelectObject(hdcSave, bmSaveOld));
{ Delete the memory DCs }
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcSave);
DeleteDC(hdcTemp);
end;
 
var
bmp: TBitmap;
......
bmp.Transparent := True;
......

就可以了;
它是取图象左下角的点的颜色为透明色;如果你要指定自己的透明色,需要加上一句
b.TransparentColor := yourColor;
 
Timage控件本身就支持背景透明。
将transparent属性设定为True,
与右下角的颜色相同的部分都将透明显示。
 
采用cqbaobao的答案,谢谢各位,

其它的相关,分数不多,不请不要介意,

再次感谢
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
786
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部