Подписаться на RSS рассылку
Главная » Статьи по Delphi » Компоненты » Как загрузить PNG (компонент TPNGImage)

Как загрузить PNG (компонент TPNGImage)

Автор: Борисов Сергей

Как же загрузить 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; // высвобождаем

Вот вобщем-то и все. Какой путь выбрать решать вам.

Просмотров: 52924

Обсудить на форуме

0   Спам
(30.01.2012)
16. Kobart
Сделал графический просмотрщик,который не видел PNG. Теперь видит. Спасибо за помощь.

0   Спам
(25.01.2012)
15. Nikita
Как сделать прозрачность?

0   Спам
(28.06.2011)
14. Hunter
Большое спасибо!!!

0   Спам
(14.04.2011)
13. Антон
У меня выдаёт ошибку если я пытаюсь загрузить PNG в TImage на стадии разработки.

Unknown picture file extension(.png)


0   Спам
(20.11.2010)
12. Delphi 7
Создаю res файл по инструкции, программа не работает...

....

var
Form1: TForm1;

implementation

{$R *.dfm}
{$R png.RES} // тут все нормально

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
png: TPNGObject;
begin
png := TPNGObject.Create;
png.LoadFromResourceName(HInstance, 'png');
Canvas.Draw(0,0, png);
png.Free;
end;

end.

ОШИБКА

... raised exeption class EResNotFound with message 'Resource png not found'. Process stopped. ...

в чем проблема то..???

Ответ: Все же скорее всего проблема в неправильно созданном файле ресурсов.

0   Спам
(04.10.2010)
11. Вася
Я извиняюсь - а какая версия TPNGImage здесь у вас выложена?
Новее ли чем моя?
Ответ: v. 1.564

0   Спам
(13.01.2010)
10. Delphi 7 Neznayka
Спасибо большое за подробное и понятное объяснение! Сэкономили кучу времени и быстро сделали то что нужно!
smile

0   Спам
(10.12.2009)
9. Check
Пробовал загрузить, со стандартными 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;

Вроде всё работает wink


0   Спам
(12.08.2009)
8. maniak
1. img RCDATA "1.png"
вместо img пишем имя ресурса
2. png.LoadFromResourceName(HInstance, 'png'); // грузим ресурс
вместо 'png' пишем имя ресурса которое указали, например img, и все работает.

0   Спам
(11.08.2009)
7. Joe
всё работает! пасиба!

1 2 »

Имя *:
Email:


Код *:

Copyright © 2008-2016 Программирование на Delphi для начинающих и не только

Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации

Хостинг от uCoz

Автор проекта: Борисов Сергей

e-mail: save-x@yandex.ru

Связь с администрацией сайта