我想在Delphi表格上画一个半透明的图像,但由于某种原因它不起作用。
这是原始的PNG(边框是半透明的):
我在TImage
对象中加载图像:
Image1.Transparent := True;
Form1.Color := clWhite;
Form1.TransparentColor := True;
Form1.TransparentColorValue := clWhite;
应用程序:
图像不是半透明的。我正在使用包含alpha通道的BMP图像。我错过了什么吗?
我找到了一个解决方案,可以让你只使用Windows API将带有alpha通道的BMP图像绘制到表单上:
const
AC_SRC_OVER = 0;
AC_SRC_ALPHA = 1;
type
BLENDFUNCTION = packed record
BlendOp,
BlendFlags,
SourceConstantAlpha,
AlphaFormat: byte;
end;
function WinAlphaBlend(hdcDest: HDC; xoriginDest, yoriginDest, wDest, hDest: integer;
hdcSrc: HDC; xoriginSrc, yoriginSrc, wSrc, hSrc: integer; ftn: BLENDFUNCTION): LongBool;
stdcall; external 'Msimg32.dll' name 'AlphaBlend';
procedure TForm4.FormClick(Sender: TObject);
var
hbm: HBITMAP;
bm: BITMAP;
bf: BLENDFUNCTION;
dc: HDC;
begin
hbm := LoadImage(0,
'C:\Users\Andreas Rejbrand\Skrivbord\RatingCtrl.bmp',
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE);
if hbm = 0 then
RaiseLastOSError;
try
if GetObject(hbm, sizeof(bm), @bm) = 0 then RaiseLastOSError;
dc := CreateCompatibleDC(0);
if dc = 0 then RaiseLastOSError;
try
if SelectObject(dc, hbm) = 0 then RaiseLastOSError;
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := 255;
bf.AlphaFormat := AC_SRC_ALPHA;
if not WinAlphaBlend(Canvas.Handle,
10,
10,
bm.bmWidth,
bm.bmHeight,
dc,
0,
0,
bm.bmWidth,
bm.bmHeight,
bf) then RaiseLastOSError;
finally
DeleteDC(dc);
end;
finally
DeleteObject(hbm);
end;
end;
使用GIMP,我转换了PNG图像
http://privat.rejbrand.se/RatingCtrl.png
发现here为32位RGBA位图,找到了here,结果非常好:
http://privat.rejbrand.se/gdiblend1.png http://privat.rejbrand.se/gdiblend2.png http://privat.rejbrand.se/gdiblend3.png
TransparentColorValue
方法不可行,因为这仅适用于单色表示完全透明的图像。 [此外,你正在玩弄窗体的透明色而不是图像的透明色!]上面的PNG图像应该有一个alpha通道,所以它不像每个像素都显示或透明 - 相反,每个像素都有一个0到1之间的不透明度(例如0.37)。也就是说,除了每个像素的R,G和B分量之外,还有一个'alpha'分量A.
但是,上面的图像似乎已损坏。 “正确”的PNG如下所示:
http://privat.rejbrand.se/RatingCtrl.png
你可以尝试将上面的一个混合到不同的背景上,你会发现阴影融合得很好。
那么,如果有一个'正确'的PNG,如何将它绘制到表格上?嗯,在你的情况下这将是非常困难的,因为Delphi 7不支持PNG图像。它只支持BMP图像,这些通常没有alpha通道。
为什么不尝试使用常规bmp将你的png绘制到新图像上。在完成后,将您想要的内容绘制到图像2上并重绘/或分配/全部到图像1。必须工作......