2011-04-27 139 views
10

我想在运行时为图像(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; 

我不知道如果底部的一个可以工作,不要猜测。只是我试过的东西。

Resource and Image

回答

24

我只是增加了一个名为SampleBitmap资源(位图图像​​)到一个新的VCL项目。然后,我添加了一个TImage控制,并赋予它一个OnClick处理程序:

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

它完美。

更新

问题是最有可能是你使用的是JPG图像,而不是位图。您无法将JPG图像加载到TBitmap中。那么该怎么办?那么,加JPEGuses条款,并做直接

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; 
+0

有趣的是,什么也没有发生onload事件,但的onclick它。但是,onclick事件(与您的相同,我更改了资源名称)会返回一个错误,指出找不到资源。 – Skeela87 2011-04-27 14:18:06

+0

@ Skeela87:那么,上面的例子是执行onclick,而不是onload。我只是给你加载图片的代码。您可以将代码放在代码中的正确位置。此外,'SampleBitmap'和'JpgImage'是我样本中资源的名称。在你的情况下,该资源被称为'Splashscreen_Background'。 – 2011-04-27 14:20:12

+0

是的,我明白了,我对你原来的帖子发表了评论。但是,这很好,TYVM。我确实加载了一个JPG,我没有意识到,我更像是一个VB人。 – Skeela87 2011-04-27 14:26:14

3

加载到TBitmap代替,像你这样的尝试:

// Create your resource like this: 
// MyResource.rc 
SPLASHBKGND BITMAP YourSplashscreen.bmp 

编译:

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

或更高版本德尔福的版本:

{$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; 
+0

我不认为我的简要方法有什么问题。 – 2011-04-27 14:15:01

+0

@安德里亚斯:没有说过。 :)我的回答是在你的出现的路上;我只是继续并发布了一个替代方案。 – 2011-04-27 14:16:10

+0

@Ken:我很确定我发现了这个问题。 OP会尝试将JPG图像加载到“TBitmap”中。这是行不通的... – 2011-04-27 14:17:21