透明图像控制,在德尔福进行重采样



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

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

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

我尝试过:

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

  • 图形32/图像32:重新采样很漂亮,但它不透明。

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

  • GR32ex(GR32扩展组件包),据说它增加了一个透明属性,但是它已经很多年没有更新了,我无法安装它。它在Delphi 2010和Graphics32 v. 1.9上抛出了无数的错误。

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

谢谢!

我很

惊讶TImage32不透明。你真的确定是这样吗?

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

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

更新 1:网络搜索揭示了一种使 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.

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

最新更新