gpt4 book ai didi

delphi - Delphi 中带重采样的透明图像控制

转载 作者:行者123 更新时间:2023-12-03 15:00:33 27 4
gpt4 key购买 nike

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

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

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

我尝试过的:

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

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

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

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

有人能想出解决方案或解决方法吗?我想要的只是一个具有透明度和重新采样的控件。

谢谢!

最佳答案

令我惊讶的是,TImage32 没有实现透明度。您真的确定是这样吗?

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

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

更新 1: Web 搜索揭示了一种使 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 - how to make the component invisible if no picture is loaded?

关于delphi - Delphi 中带重采样的透明图像控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190472/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com