Как же загрузить PNG файл в Delphi? Совсем не сложно, для этого нам понадобится модуль TPNGImage Скачать [268 КБ]. Теперь TPNGImage вошел в состав VCL и будет идти в комплекте с Delphi 2009 и последующими версиями.
Создаем новый проект, сохраняем его, копируем в папку где сохранен проект все содержимое архива (естественно без справки). В секцию uses проекта добавляем pngimage. Теперь можно обычным методом LoadFromFile до боли знакомого TPicture загрузирь PNG файл. Теперь от слов к делу. Выложите на форму TButton и TImage. Создайте обработчик события OnClick кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('test.png');
end;
Запускаем проект и жмем кнопочку, в итоге файл успешно загружается, причем с поддержкой альфа каналов, что дает больше возможностей для оформления интерфейса программ.
Но при таком подходе, помимо самой EXE нужны еще и графические файлы PNG, что в некоторых программах неприемлемо. В этом случае можно поступить совсем просто. Взять и вручную, во время разработки приложения загрузить в TImage файл, точно также как мы поступали с JPEG и BMP. При этом вся графика будет храниться в EXE и внешние PNG файлы будут не нужны.
Есть и еще один вариант - создать ресурс и загружать PNG из ресурса. Для компиляции ресурсов со средой разработки Delphi поставляется 32-разрядный компилятор (brcc32.exe):
1. Создайте BAT файл со следующим содержимым:
"C:\Program Files\Borland\Delphi7\Bin\brcc32.exe" %1
2. Создайте текстовый файл со следующим содержимым:
img RCDATA "1.png"
3. Скопируйте эти два файла и PNG файл с именем 1.png в отдельную папку.
4. Перетащите текстовый файл на BAT файл. Если Вы все сделали правильно, то должен появиться еще один файл с расширением RES. Файл будет называться точно также как и ваш текстовый файл.
Переименуйте этот файл в png.res и скопируйте в папку с сохраненным проектом. Далее открываем проект и после
implementation
{$R *.dfm}
добавьте {$R png.RES}. Этим вы прикрепили файл ресурса (png.res) к своему проекту и содержимое этого файла будет находиться в EXE.
Теперь остается только загрузить эти данные. Обявите переменную
var png: TPNGObject;
Описание типа TPNGObject находится в прикрепленном модуле pngimage. Прикрепили мы его в самом начале статьи. Дальше кидаем на форму кнопку и создаем обработчик клика по кнопке:
png := TPNGObject.Create; // создаем
png.LoadFromResourceName(HInstance, 'png'); // грузим ресурс
Image1.Canvas.Draw(0, 0, png); // выводим
png.Free; // высвобождаем
Вот вобщем-то и все. Какой путь выбрать решать вам.
Просмотров: 58591
Сделал графический просмотрщик,который не видел PNG. Теперь видит. Спасибо за помощь.
|
13. Антон
У меня выдаёт ошибку если я пытаюсь загрузить PNG в TImage на стадии разработки.
Unknown picture file extension(.png) |
Создаю res файл по инструкции, программа не работает...
.... var implementation {$R *.dfm} procedure TForm1.SpeedButton1Click(Sender: TObject); end. ОШИБКА ... raised exeption class EResNotFound with message 'Resource png not found'. Process stopped. ... в чем проблема то..??? Ответ: Все же скорее всего проблема в неправильно созданном файле ресурсов.
|
11. Вася
Я извиняюсь - а какая версия TPNGImage здесь у вас выложена?
Новее ли чем моя? Ответ: v. 1.564
|
10. Delphi 7 Neznayka
Спасибо большое за подробное и понятное объяснение! Сэкономили кучу времени и быстро сделали то что нужно!
|
Пробовал загрузить, со стандартными PNG работало всё нормально (запускал с файлами с 32 bpp), однако как только я изменил bpp на 24 / 8 / 4 / 1 и сохранил файлы при помощи ACDSee 3.0, сразу же стали выдаваться ошимки (чтение из потока), стал копаться, оказалось что при чтении блоков данных из потока признаком конца файла принимается условие:
until (ChunkName = 'IEND'); (строка ~5041) а в файлах, сохраненных при помощи ACDSee как раз этого блока и не хватает (экономия в размере файла 8 байт). ВЫХОД НАШЁЛ ПРОСТЕЙШИЙ: Добавил переменную: StreamSz : INTEGER; Инициализировал: StreamSz := Stream.Size; Заменил вышеуказанное условие на: until Stream.Position >= StreamSz; Вроде всё работает |
8. maniak
1. img RCDATA "1.png"
вместо img пишем имя ресурса 2. png.LoadFromResourceName(HInstance, 'png'); // грузим ресурс вместо 'png' пишем имя ресурса которое указали, например img, и все работает. |
Copyright © 2008 - 2018 Программирование на Delphi для начинающих и не только.
Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам.
Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации.