在Delphi中使用重采样进行透明图像控制

Mic*_*ael 6 delphi delphi-2010

我有一个带有背景图像的表单(在Form1.Repaint中的表单上绘制).

我在寻找:一个透明的图像控件,可以平滑地调整(重新采样)加载的图像.

(我需要它是透明的,因为表格背景图像应该是可见的)

我尝试过的:

  • 标准TImage:它是透明的,但不会重新取样.

  • Graphics32/Image32:重新采样精美,但不透明.

    我已经用谷歌搜索了几个小时来修复或解决方法,但没有太多的解决方案.这与加载到Image32中的图像是透明的无关,而是控件的背景颜色仍然是白色(白色= Image32控件的颜色属性,并将其设置为clNone不起作用).这显然是按照设计的

  • GR32ex(GR32扩展组件包),据说可以添加一个Transparent-property,但多年来它还没有更新,我无法安装它.它在Delphi 2010和Graphics32 v.1.9上引发了大量错误.

任何人都可以想到解决方案或解决方法吗?我想要的只是一个具有透明度和重新采样的控件.

谢谢!

Dav*_*nan 6

我很惊讶TImage32没有透明度.你真的确定是这样的吗?

无论如何,如果是这样,我会将透明度支持TImage与重新采样能力相结合TBitmap32,以此方式构建解决方案.将原始图像保留在TBitmap32实例中.每当您需要将其加载到TImage组件中时,例如在重新调整大小时,请使用TBitmap32执行内存中的重新调整大小并加载重新调整大小的图像.

事实上,如果您已经自己绘制了表单的背景,为什么不自己绘制图像并简单地取消图像控件?

更新1: Websearch揭示了一种使TImage32透明的简单方法:http://graphics32.org/news/newsgroups.php?art_group = graphics32.general&article_id = 9505

更新2:上面的链接已经死了,新闻组只能通过NNTP访问.我不能100%肯定,但我认为链接的帖子是Michael Haralabos并包含以下文件:

unit GR32_ImageEx;

// Transparent TImage32 by Michael Haralabos

interface

uses
  Windows, Messages, Classes, GR32_Image, GR32;

type
  TImage32Ex = class(TImage32)
  private
    FTransparent: Boolean;

    procedure SetTransparent(const Value: Boolean);
  public
    procedure ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer); override;
  published
    property Enabled;
    property Transparent: Boolean read FTransparent write SetTransparent;
  end;

procedure Register;

implementation

procedure TImage32Ex.ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer);
var
  P: TPoint;
  SaveIndex: Integer;
begin
  if FTransparent and Assigned(Parent) and
     not (Assigned(Bitmap) and (BitmapAlign = baTile)) then
  begin
    SaveIndex := SaveDC(Dest.Handle);
    GetViewportOrgEx(Dest.Handle, P);
    SetViewportOrgEx(Dest.Handle, P.X - Left, P.Y - Top, nil);
    IntersectClipRect(Dest.Handle, 0, 0, Parent.ClientWidth, Parent.ClientHeight);
    Parent.Perform(WM_ERASEBKGND, Dest.Handle, 0);
    Parent.Perform(WM_PAINT, Dest.Handle, 0);
    RestoreDC(Dest.Handle, SaveIndex);
  end
  else
    inherited;
end;

procedure TImage32Ex.SetTransparent(const Value: Boolean);
begin
  if FTransparent <> Value then
  begin
    FTransparent := Value;
    Invalidate;
  end;
end;

procedure Register;
begin
  RegisterComponents('Graphics32', [TImage32Ex]);
end;

end.
Run Code Online (Sandbox Code Playgroud)

这里的另一个主题表明,这可能是现在死链接所指的:Delphi TImage32 - 如果没有加载图片,如何使组件不可见?