为何白色不能透明,没人会吗? (100分)

  • 主题发起人 主题发起人 wjp888
  • 开始时间 开始时间
W

wjp888

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的过程能在TReportCover画布上建立一副BMP图,那位高人能指点一下怎样才能把BMP图白色透明。(即:白色不显示,或白色不能挡住TReportCover画布上的表格线和文字,就像在TReportCover画布上盖了个公章一样)。

procedure TReportCover.BltTBitmapAsDib(DestDc: HDC; X, Y, Width, Height: Word; Bmp: TBitmap); {the TBitmap to Blt}
var
OriginalWidth: LongInt; // Bmp的宽度
DC: HDC; // 显示的环境DC
IsPaletteDevice: Bool; // 设备是否用到调色板
IsDestPaletteDevice: Bool;// 设备是否用到调色板s
BitmapInfoSize: Integer; // Bitmap的头信息长度
lpBitmapInfo: PBitmapInfo;// Bitmap的头信息
hBm: hBitmap; // Bitmap的句柄
hPal: hPalette; // 调色板的句柄
OldPal: hPalette; // 临时调色板

hBits: THandle; // DIB bits的句柄
pBits: pointer; // DIB bits的内存地址
lPPalEntriesArray: PPalEntriesArray;
NumPalEntries: Integer; // 调色板数目
I: Integer;
begin

Bmp.Transparent:=true;   //我加的无任何作用
Bmp.TransparentColor:=clwhite;//我加的无任何作用

OldPal := 0;
OriginalWidth := Bmp.Width;
DC := GetDc(0);
IsPaletteDevice := GetDeviceCaps(DC, RASTERCAPS) and RC_PALETTE = RC_PALETTE;
ReleaseDc(0, DC);

if IsPaletteDevice then
BitmapInfoSize := SizeOf(TBitmapInfo) + (SizeOf(TRGBQUAD) * 255)
else
BitmapInfoSize := SizeOf(TBitmapInfo);
GetMem(lpBitmapInfo, BitmapInfoSize);

FillChar(lpBitmapInfo^, BitmapInfoSize, #0);
lpBitmapInfo^.bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
lpBitmapInfo^.bmiHeader.biWidth := OriginalWidth;
lpBitmapInfo^.bmiHeader.biHeight := Bmp.Height;
lpBitmapInfo^.bmiHeader.biPlanes := 1;

if IsPaletteDevice then
lpBitmapInfo^.bmiHeader.biBitCount := 8
else
lpBitmapInfo^.bmiHeader.biBitCount := 24;
lpBitmapInfo^.bmiHeader.biCompression := BI_RGB;
lpBitmapInfo^.bmiHeader.biSizeImage := 0;
lpBitmapInfo^.bmiHeader.biXPelsPerMeter := 0;
lpBitmapInfo^.bmiHeader.biYPelsPerMeter := 0;
if IsPaletteDevice then
begin
lpBitmapInfo^.bmiHeader.biClrUsed := 256;
lpBitmapInfo^.bmiHeader.biClrImportant := 256;
end
else
begin
lpBitmapInfo^.bmiHeader.biClrUsed := 0;
lpBitmapInfo^.bmiHeader.biClrImportant := 0;
end;
hBm := Bmp.ReleaseHandle;
hPal := Bmp.ReleasePalette;

DC := GetDc(0);

if IsPaletteDevice then
begin
OldPal := SelectPalette(DC, hPal, True);
RealizePalette(DC);
end;
GetDiBits(DC, hBm, 0, lpBitmapInfo^.bmiHeader.biHeight, nil,
TBitmapInfo(lpBitmapInfo^), DIB_RGB_COLORS);

hBits := GlobalAlloc(GMEM_MOVEABLE, lpBitmapInfo^.bmiHeader.biSizeImage);
pBits := GlobalLock(hBits);
GetDiBits(DC, hBm, 0,lpBitmapInfo^.bmiHeader.biHeight, pBits,
TBitmapInfo(lpBitmapInfo^), DIB_RGB_COLORS);

if IsPaletteDevice then
begin
GetMem(lPPalEntriesArray, sizeof(TPaletteEntry) * 256);
//NumPalEntries := GetPaletteEntries(hPal, 0, 256, lPPalEntriesArray^);
NumPalEntries := GetSystemPaletteEntries(DC, 0, 256, lPPalEntriesArray^);
for i := 0 to (NumPalEntries - 1) do
begin
lpBitmapInfo^.bmiColors.rgbRed := lPPalEntriesArray^.peRed;
lpBitmapInfo^.bmiColors.rgbGreen := lPPalEntriesArray^.peGreen;
lpBitmapInfo^.bmiColors.rgbBlue := lPPalEntriesArray^.peBlue;
end;
FreeMem(lPPalEntriesArray, SizeOf(TPaletteEntry) * 256);
end;

if IsPaletteDevice then
begin
SelectPalette(DC, OldPal, TRUE);
RealizePalette(DC);
end;
ReleaseDc(0, DC);
IsDestPaletteDevice := GetDeviceCaps(DestDc, RASTERCAPS) and RC_PALETTE = RC_PALETTE;

if IsPaletteDevice then
begin
OldPal := SelectPalette(DestDc, hPal, TRUE);
RealizePalette(DestDc);
end;

{Do the Blt}
StretchDiBits(DestDc, X, Y, Width, Height, 0, 0, OriginalWidth,
lpBitmapInfo^.bmiHeader.biHeight, pBits, lpBitmapInfo^, DIB_RGB_COLORS, SrcCopy);

if IsDestPaletteDevice then
begin
SelectPalette(DestDc, OldPal, TRUE);
RealizePalette(DestDc);
end;
//=====================我加的无任何作用
// Bmp.Modified:=true;
// Bmp.Transparent:=true;
// Bmp.TransparentColor:=clwhite;
// Bmp.Canvas.Draw(0,0,Bmp);
// Bmp.Transparent:= true;
// TransparentBlt(hBm, 0, 0, Bmp.Width, BmP.Height,
// Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, RGB($FF, $FF, $FF));
//======================

GlobalUnLock(hBits);
GlobalFree(hBits);

FreeMem(lpBitmapInfo, BitmapInfoSize);
Bmp.Handle := hBm;
Bmp.Palette := hPal;
end;
 
该出手时就出手----请不要谦虚。
 
Bmp.Transparent:=true;   //我加的无任何作用
Bmp.TransparentColor:=clwhite;//我加的无任何作用
将两句话调换一次位置
 
to SandWater:
Bmp.TransparentColor:=clwhite;//我加的无任何作用
Bmp.Transparent:=true;   //我加的无任何作用
将两句话调换一次位置后还是不行,请继续讨论。
 
高手那去了?
 
高手那去了???
 
难道真的没高手了吗?
 
你的代码太长,很少有人有兴趣看的,太费时间,看看你的提问方式是否合适,我不懂画图的
 
宁柯为何不来了?
 
高手也不来了。
 
有会的吗?
 
再次提前,请帮忙。
 
Bmp.Transparent:=true;   //我加的无任何作用
Bmp.TransparentColor:=clwhite;//我加的无任何作用
根据情况分析,应该是你的图像白色部分不是clwhite的,
一般肉眼很难分辨。一般比较多的做法是取Bitmap的[0,0]即
左上角的颜色做透明色,ImageList就是这么干的。
而且你的次序也反了,应该先设TransparentColor := clWhite;
再Transparent := true;
我的写法:
Bmp.TransparentColor := Bmp.Canvas.Pixels[0,0];
Bmp.Transparent;
 
谢谢rainxy2002:
Bmp.TransparentColor := Bmp.Canvas.Pixels[0,0];
Bmp.Transparent;
用了这两行代码后,跟没用一样,图像还是不能透明。

 
用这个吧:
for i:=0 to bmp.width-1
for j:=0 to bmp.height -1
begin
if bmp.Pixels[i,j]<>clWhite then
//不是白色就画这个点
end;
 
谢谢fdlsoft,您的方法可能可以,但每次都要去循环这个图像将会非常慢,有没有更好的代码?
 
后退
顶部