加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:13:42 所属栏目:大数据 来源:网络整理
导读:我想在Delphi表单上绘制透明图像,但它不起作用. 这是原始的PNG: 我已经在TImage中加载了图像:: Image1.Transparent := True;Form1.Color := clWhite;Form1.TransparentColor := True;Form1.TransparentColorValue := clWhite; 应用程序: 图像不完全透明.
我想在Delphi表单上绘制透明图像,但它不起作用.

这是原始的PNG:

我已经在TImage中加载了图像::

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

应用程序:

图像不完全透明.
图像可以通过任何控件或仅通过画布绘制.
我想用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:UsersAndreas RejbrandSkrivbordRatingCtrl.bmp',IMAGE_BITMAP,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,bm.bmWidth,bm.bmHeight,dc,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读