Як завантажити png (компонент tpngimage)

Створюємо новий проект, зберігаємо його, копіюємо в папку де збережений проект весь вміст архіву (природно без довідки). У секцію uses проекту додаємо pngimage. Тепер можна звичайним методом LoadFromFile до болю знайомого TPicture загрузірь PNG файл. Тепер від слів до справи. Викладіть на форму TButton і TImage. Створіть обробник події OnClick кнопки:

Запускаємо проект і тиснемо кнопочку, в результаті файл успішно завантажується, причому з підтримкою альфа каналів, що дає більше можливостей для оформлення інтерфейсу програм.

Але при такому підході, крім самої EXE потрібні ще й графічні файли PNG, що в деяких програмах неприйнятно. В цьому випадку можна поступити зовсім просто. Взяти і вручну, під час розробки програми завантажити в TImage файл, точно також як ми жили згідно з JPEG і BMP. При цьому вся графіка буде зберігатися в EXE і зовнішні PNG файли будуть не потрібні.

Є і ще один варіант - створити ресурс і завантажувати PNG з ресурсу. Для компіляції ресурсів із середовищем розробки Delphi поставляється 32-розрядний компілятор (brcc32.exe):

1. Створіть BAT файл з наступним змістом:

2. Створіть текстовий файл з наступним змістом:

3. Скопіюйте ці два файли і PNG файл з ім'ям 1.png в окрему папку.

4. Перетягніть текстовий файл на BAT файл. Якщо Ви все зробили правильно, то повинен з'явитися ще один файл з розширенням RES. Файл буде називатися так само як і ваш текстовий файл.

Перейменуйте цей файл в png.res і скопіюйте в папку зі збереженим проектом. Далі відкриваємо проект і після

додайте. Цим ви прикріпили файл ресурсу (png.res) до свого проекту і вміст цього файлу буде перебувати в EXE.

Тепер залишається тільки завантажити ці дані. обявил змінну

Опис типу TPNGObject знаходиться в прикріпленому модулі pngimage. Прикріпили ми його на самому початку статті. Далі кидаємо на форму кнопку і створюємо обробник кліка по кнопці:

Ось вобщем-то і все. Який шлях вибрати вирішувати вам.

Пробував завантажити, зі стандартними 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;

Начебто все працює