从嵌入资源中加载图像

12

我正在尝试在运行时为一个图片(Image1)分配一张图片。

由于我不能设置属性从资源中加载,所以我需要在运行时加载。

我有这段代码:

procedure TForm1.FormCreate(Sender: TObject); 
var RS:Tresourcestream ; 
begin 
RS := TResourceStream.Create(HInstance,'Splashscreen_Background', RT_RCDATA);   
image1.Picture.Bitmap.LoadFromResourcename(HInstance,'splashscreen_background'); 
end;

但它只是用空白图像加载表单。

以及:

procedure TForm1.FormCreate(Sender: TObject);
BitMap1 : TBitMap;
begin
BitMap1 := TBitMap.Create;
BitMap1.LoadFromResourceName(HInstance,'Live');
image1.Picture.Bitmap.Assign(Bitmap1);
end;
我不知道底部的那个是否能够工作,我猜不行。这只是我尝试过的东西。资源和图片
2个回答

29

我刚刚在一个新的VCL项目中添加了一个名为SampleBitmap的资源(一个位图图像)。然后我添加了一个TImage控件,并为它设置了一个OnClick处理程序:

procedure TForm1.Image1Click(Sender: TObject);
begin
  Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'SampleBitmap');
end;

它完美运行。

更新

问题很可能是您正在使用JPG图像,而不是位图。无法将JPG图像加载到TBitmap中。那么该怎么办呢?好的,将JPEG添加到您的uses子句中,并执行以下操作:

procedure TForm5.Image1Click(Sender: TObject);
var
  RS: TResourceStream;
  JPGImage: TJPEGImage;
begin
  JPGImage := TJPEGImage.Create;
  try
    RS := TResourceStream.Create(hInstance, 'JpgImage', RT_RCDATA);
    try
      JPGImage.LoadFromStream(RS);
      Image1.Picture.Graphic := JPGImage;
    finally
      RS.Free;
    end;
  finally
    JPGImage.Free;
  end;
end;

有趣的是,在页面加载时什么都没有发生,但是在点击时它会执行。然而,当我用您相同的onclick事件(只是更改了资源名称)时,它返回一个错误,说找不到该资源。 - Skeela87
@Skeela87:嗯,上面的示例是为了在单击时执行而不是在载入时执行。我只是给你加载图像的代码。将代码放置在您代码中的正确位置取决于您。此外,“SampleBitmap”和“JpgImage”是我的示例中资源的名称。在您的情况下,资源的名称应该是“Splashscreen_Background”。 - Andreas Rejbrand
我明白了,我在你的原始帖子中留下了我的评论。但那个好用,非常感谢。我加载了一个JPG,我之前没有意识到,我更喜欢VB。 - Skeela87
@Uwe:哦,finally 中的 Bug 真是一个很酷的 Bug!感谢您纠正它! - Andreas Rejbrand
在 maXbox 中设置直接使用 JPEG 或 JPG 标记: aname:= 'MAXBOX4LOGO'; RS:= TResourceStream.Create(hInstance,aname,'JPEG'); - Max Kleiner

4
直接将其加载到TBitmap中,就像您尝试的那样:
// Create your resource like this:
// MyResource.rc
SPLASHBKGND BITMAP YourSplashscreen.bmp

编译它:

C:\YourResFolder\Brcc32 MyResource.rc MyResource.res

或者在 Delphi 的后续版本中:

{$R MyResource.res MyResource.rc}

使用它:

procedure TForm1.FormCreate(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromResourceName(HInstance, 'SPLASHBKGND');
    Image1.Picture.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;

我认为我的简短方法没有任何问题。 - Andreas Rejbrand
@Andreas:没说有这个问题。:) 我的回答正在路上,你的出现之前;我只是继续发布了一个替代方案。 - Ken White
@Ken:我相当确定我找到了问题所在。原帖中试图将JPG图像加载到TBitmap中,这是不可能的... - Andreas Rejbrand
1
如果资源链接到了包含此代码的库或软件包中,则 MainInstance 是错误的。建议应该是使用 MainInstance 或 HInstance,以引用具有资源的模块。我只使用 HInstance,因为我只从与其链接的同一模块加载资源。 - David Heffernan
虽然我更喜欢安德烈的简洁方法,但非常感谢您的回复。 - Skeela87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接