我有一张带有背景图片的表单(在Form1.Repaint中的表单上绘制)。
我在寻找什么:一个透明的图像控件,可以平滑地调整(重新采样)加载的图像。
(我需要它是透明的,因为表格背景图像应该是可见的)
我尝试了什么:
标准TImage:它是透明的,但不会重新取样。
Graphics32 / Image32:重新采样效果很好,但不透明。
我已经用谷歌搜索了几个小时来修复或解决方法,但没有太多的解决方案。这与加载到Image32中的图像是透明的无关,而是控件的背景颜色仍然是白色(白色= Image32控件的颜色属性,并将其设置为clNone不起作用)。 This is apparently as designed
GR32ex (GR32扩展组件包),据说可以添加一个Transparent-property,但是多年来它还没有更新,我无法安装它。它在Delphi 2010和Graphics32 v.1.9上引发了大量错误。
有人能想到解决方案或解决方法吗?我想要的只是一个透明度和重新采样的控件。
谢谢!
答案 0 :(得分:6)
我很惊讶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 - how to make the component invisible if no picture is loaded?