如何在表单上绘制半透明图像?

时间:2011-05-11 13:02:53

标签: delphi transparency delphi-7 alphablending

我想在德尔福表格上绘制半透明图像,但由于某种原因它无效。

这是原始的PNG(边框是半透明的):
Transparent border

我将图片加载到TImage对象中:

Image1.Transparent := True;
Form1.Color := clWhite;
Form1.TransparentColor := True;
Form1.TransparentColorValue := clWhite;

TImage

申请:
Application


图像不是半透明的。我正在使用包含alpha通道的BMP图像。我错过了什么吗?

3 个答案:

答案 0 :(得分:11)

我找到了一个解决方案,可让您只使用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

答案 1 :(得分:1)

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通道。

答案 2 :(得分:1)

为什么不尝试使用常规bmp将png绘制到新图像上。在完成后,将您想要的内容绘制到图像2上并重绘/或分配/全部到图像1。必须工作......