Как мне сделать ресурс PNG? - PullRequest
34 голосов
/ 20 июля 2009

У меня есть форма с большим изображением в качестве фона. Проблема в том, что он хранится непосредственно в DFM в виде растрового изображения, занимающего около 3 МБ. Исходный файл PNG ~ 250K. Я хотел бы попытаться уменьшить раздувание, встраивая PNG в ресурс, а затем загружая его во время OnCreate. Я могу сделать это теперь, когда Delphi 2009 включает поддержку PNG, за исключением того, что я не совсем знаю, как создать файл ресурсов с PNG в нем. Кто-нибудь знает, как это делается?

Ответы [ 5 ]

53 голосов
/ 20 июля 2009

Пример текстового файла (с именем myres.rc):

MYPNG RCDATA mypng.png

Добавлено в проект:

{$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;
2 голосов
/ 16 сентября 2011

Для тех, кто использует 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);
1 голос
/ 18 ноября 2009
1 голос
/ 21 августа 2009

Если вы используете Delphi 2009, TImage должен сохранить ваш файл PNG в формате PNG в файле DFM. DFM будет больше, потому что двоичное содержимое свойства Picture.Data объекта TImage закодировано в DFM как шестнадцатеричный текст. Но когда DFM скомпилирован в ваш EXE-файл, он скомпилирован в двоичный ресурс. Затем ваше изображение должно занимать то же пространство внутри ресурса RCDATA формы, что и хранение PNG в собственном ресурсе RCDATA.

Я только что проверил это, открыв один из моих собственных файлов DFM Delphi 2009 с компонентом TImage с изображением PNG, загруженным во время разработки в текстовом редакторе, скопировав содержимое свойства Picture.Data и вставив его в шестнадцатеричный код. редактор. Шестнадцатеричный редактор показывает мне, что свойство Picture.Data хранит фактический файл PNG с префиксом 10 байтов. Первый байт равен $ 09, а следующие 9 байтов означают TPngImage. Если я удаляю эти 10 байтов и сохраняю файл в шестнадцатеричном редакторе, я получаю правильный файл PNG.

Так что, если вы используете Delphi 2009, просто загрузите изображение PNG в компонент TImage во время разработки.

0 голосов
/ 07 апреля 2018

При использовании Resource Hacker изображения PNG добавляются с ' PNG ' ResType вместо обычного RT_RCDATA .

Помощник класса TPngImage предлагает простое решение этой проблемы:

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

...

Procedure TPngImageHelper.LoadFromRHResourceName(Instance: HInst; Const Name: String);
Var
  rs: TResourceStream;
Begin
  rs := TResourceStream.Create(Instance, PChar(Name), 'PNG');
  Try
    LoadFromStream(rs);
  Finally
    rs.Free;
  End;
End;

При простом использовании:

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