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

标签 delphi transparency delphi-7 alphablending

我想在 Delphi 窗体上绘制半透明图像,但由于某种原因它不起作用。

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

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

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

TImage

应用:
Application


图像不是半透明的。我正在处理包含 Alpha channel 的 BMP 图像。我错过了什么吗?

最佳答案

我找到了一个解决方案,可以让您仅使用 Windows API 将带有 Alpha channel 的 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 图像

找到here到 32 位 RGBA 位图,找到 here ,结果非常好:

关于delphi - 如何在表单上绘制半透明图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5964701/

相关文章:

Delphi - 从外部文件执行函数和过程

java - 如何获取对 DLL 的 java JNA 调用以获取参数中返回的数据?

delphi - 当消息处理程序不调用继承时会发生什么?

delphi - 迭代节点及其子节点并修改数据

delphi - Delphi 7 中的 GetStackTrace?

delphi - 从注册表读取时将十六进制转换为字符串

sql-server - FieldByName 注入(inject)安全吗?

html - 是否可以在半透明背景上制作透明正方形?

c++ - 对半透明对象实现深度测试

html - 视频作为背景完全覆盖半透明背景颜色