Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何制作PNG资源?_Delphi_Png_Delphi 2009_Resources - Fatal编程技术网

Delphi 如何制作PNG资源?

Delphi 如何制作PNG资源?,delphi,png,delphi-2009,resources,Delphi,Png,Delphi 2009,Resources,我有一张表格,上面有一个大的TImage作为背景。问题是,它直接以位图的形式存储在DFM中,占用大约3MB的空间。原始PNG文件约为250K。我想通过在资源中嵌入PNG,然后让表单在OnCreate期间加载它来减少膨胀。既然Delphi2009包含了PNG支持,我就可以这样做了,只是我不太知道如何构建一个包含PNG的资源文件。有人知道这是怎么做的吗?示例文本文件(名为myres.rc): 添加到项目中: {$R 'myres.res' 'myres.rc'} 运行时加载的示例: uses

我有一张表格,上面有一个大的
TImage
作为背景。问题是,它直接以位图的形式存储在DFM中,占用大约3MB的空间。原始PNG文件约为250K。我想通过在资源中嵌入PNG,然后让表单在
OnCreate
期间加载它来减少膨胀。既然Delphi2009包含了PNG支持,我就可以这样做了,只是我不太知道如何构建一个包含PNG的资源文件。有人知道这是怎么做的吗?

示例文本文件(名为myres.rc):

添加到项目中:

{$R 'myres.res' 'myres.rc'}
运行时加载的示例:

uses
  PngImage;

var
  Png: TPngImage;
begin
  Png := TPngImage.Create;
  try
    Png.LoadFromResourceName(HInstance, 'MYPNG');
    Image1.Picture.Graphic := Png; // Image1: TImage on the form
  finally
    Png.Free;
  end;
end;
示例文本文件(名为myres.rc):

添加到项目中:

{$R 'myres.res' 'myres.rc'}
运行时加载的示例:

uses
  PngImage;

var
  Png: TPngImage;
begin
  Png := TPngImage.Create;
  try
    Png.LoadFromResourceName(HInstance, 'MYPNG');
    Image1.Picture.Graphic := Png; // Image1: TImage on the form
  finally
    Png.Free;
  end;
end;

如果您使用的是Delphi 2009,TImage应该将您的PNG文件作为PNG存储到DFM文件中。DFM将更大,因为图片的二进制内容。TImage对象的数据属性在DFM中编码为十六进制文本。但是当DFM被编译成EXE时,它被编译成二进制资源。然后,您的图像应该在表单的RCDATA资源中占用与在其自己的RCDATA资源中存储PNG相同的空间

我只是通过打开自己的Delphi 2009 DFM文件来测试这一点,该文件有一个TImage组件,在设计时在文本编辑器中加载了PNG图像,复制Picture.Data属性的内容并将其粘贴到一个十六进制编辑器中。hex编辑器向我显示Picture.Data属性存储一个实际的PNG文件,前缀为10字节。第一个字节是$09,接下来的9个字节拼写为TPngImage。如果我删除这10个字节并将文件保存在十六进制编辑器中,我会得到一个正确的PNG文件


因此,如果使用Delphi 2009,只需在设计时将PNG图像加载到TImage组件中即可。

如果使用Delphi 2009,TImage应将PNG文件作为PNG存储到DFM文件中。DFM将更大,因为图片的二进制内容。TImage对象的数据属性在DFM中编码为十六进制文本。但是当DFM被编译成EXE时,它被编译成二进制资源。然后,您的图像应该在表单的RCDATA资源中占用与在其自己的RCDATA资源中存储PNG相同的空间

我只是通过打开自己的Delphi 2009 DFM文件来测试这一点,该文件有一个TImage组件,在设计时在文本编辑器中加载了PNG图像,复制Picture.Data属性的内容并将其粘贴到一个十六进制编辑器中。hex编辑器向我显示Picture.Data属性存储一个实际的PNG文件,前缀为10字节。第一个字节是$09,接下来的9个字节拼写为TPngImage。如果我删除这10个字节并将文件保存在十六进制编辑器中,我会得到一个正确的PNG文件


>如果你使用Delphi 2009,只需在设计时将PNG映像加载到一个Times组件中。

与我的例子非常相似:

与我的例子非常相似:

< P>对于使用C++ Builder的人来说,这个代码对我来说是有用的:

在ResourceTest.rc文件中

IMG_BMP BITMAP "Ressources\\myimage.bmp";
IMG_PNG RCDATA "Ressources\\myimage.png";
在ResourceTest.rh文件中

#ifndef ResourceTestRH
#define ResourceTestRH

#define IMG_BMP "IMG_BMP"
#define IMG_PNG "IMG_PNG"

#endif
在ResourceTest.cpp文件中

#include "pngimage.hpp"

// Loading bmp image from resource
Graphics::TBitmap *bmpImage = new Graphics::TBitmap();
bmpImage->LoadFromResourceName((int)HInstance, IMG_BMP);

// Loading png image from resource
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, IMG_PNG);

<>对于使用C++ Builder的人来说,这个代码对我来说是有用的:

在ResourceTest.rc文件中

IMG_BMP BITMAP "Ressources\\myimage.bmp";
IMG_PNG RCDATA "Ressources\\myimage.png";
在ResourceTest.rh文件中

#ifndef ResourceTestRH
#define ResourceTestRH

#define IMG_BMP "IMG_BMP"
#define IMG_PNG "IMG_PNG"

#endif
在ResourceTest.cpp文件中

#include "pngimage.hpp"

// Loading bmp image from resource
Graphics::TBitmap *bmpImage = new Graphics::TBitmap();
bmpImage->LoadFromResourceName((int)HInstance, IMG_BMP);

// Loading png image from resource
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, IMG_PNG);
使用时,PNG图像会添加“PNG”重新键入,而不是普通的RT\u RCDATA

TPngImage类帮助程序为该问题提供了一个简单的解决方案:

Type
  TPngImageHelper = Class Helper For Vcl.Imaging.pngimage.TPngImage
    Procedure LoadFromRHResourceName(Instance: HInst; Const Name: String);
  End;

使用简单:

var
  pngInfo: TPngImage;
begin
  pngInfo := TPngImage.Create;
  try
    pngInfo.LoadFromRHResourceName(HInstance, 'MY_IMAGE.PNG');
    Image1.Picture.Graphic:= pngInfo;
  finally
    pngInfo.Free;
  end;
end;
使用时,PNG图像会添加“PNG”重新键入,而不是普通的RT\u RCDATA

TPngImage类帮助程序为该问题提供了一个简单的解决方案:

Type
  TPngImageHelper = Class Helper For Vcl.Imaging.pngimage.TPngImage
    Procedure LoadFromRHResourceName(Instance: HInst; Const Name: String);
  End;

使用简单:

var
  pngInfo: TPngImage;
begin
  pngInfo := TPngImage.Create;
  try
    pngInfo.LoadFromRHResourceName(HInstance, 'MY_IMAGE.PNG');
    Image1.Picture.Graphic:= pngInfo;
  finally
    pngInfo.Free;
  end;
end;

RCDATA
真的是该图形类型可用的最具体的资源类型吗?例如,没有
RT\u PNG
?问得好,罗伯。我当前安装的平台SDK是针对Windows Server 2003 R2的,在WinUser.h中找不到特定于PNG的常量。不过我不确定。可能会在其他地方宣布,可能在更高版本的平台SDK中。LoadFromResourceName专门查找RCDATA类型的资源。您也可以在MSBuild进程中包含该资源:对于.DLL项目,自动编译.rc文件似乎不起作用。
RCDATA
真的是该图形类型可用的最具体的资源类型吗?例如,没有
RT\u PNG
?问得好,罗伯。我当前安装的平台SDK是针对Windows Server 2003 R2的,在WinUser.h中找不到特定于PNG的常量。不过我不确定。它可能在其他地方声明,可能是在更高版本的平台SDK中。LoadFromResourceName专门查找RCDATA类型的资源。您也可以在MSBuild进程中包含该资源:对于.DLL项目,自动.rc文件编译似乎不起作用?有趣,但是,如果一个图像在多个表单上被重用,情况又如何呢?Delphi是否足够聪明,可以只存储一个副本,或者它存储映像n次,其中n是加载该映像的TImage组件的数量?:)每个TImage组件独立于任何其他TImage实例存储其图像。因此,如果将同一图像加载到TImage的n个实例中,则同一图像将被存储n次。解决这个问题的一种方法是使用表单继承。使用TImage创建一个基本表单,并将图像加载到其中。然后从该表单中导出需要具有相同时间的所有表单。在后代表单中未更改的任何属性仅存储在祖先表单的DFM中。这包括图像的图片数据。很有趣,但是如果一个图像在多个表单上被重用,情况会怎样呢?Delphi是否足够聪明,可以只存储一个副本,或者它存储映像n次,其中n是加载该映像的TImage组件的数量?:)每个TImage组件独立于任何其他TImage实例存储其图像。