Как я делаю ресурс PNG?

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

35
задан Fabrizio 31 August 2019 в 00:03
поделиться

3 ответа

Пример текстового файла (с именем 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;
54
ответ дан 27 November 2019 в 07:10
поделиться

Если вы используете 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 во время разработки.

1
ответ дан 27 November 2019 в 07:10
поделиться
1
ответ дан 27 November 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: