Технологія відображення растрів

Для виведення DIB-растрів використовуються функції StretchDIBits і SetDIBitsToDevice Функція StretchDIBits має наступні параметри:

– дескриптор контексту пристрою

– х і у координати, ширина і висота області-приймача зображення (в логічних одиницях)

– х і у координати, ширина і висота області-джерела зображення ^ пікселах)

– адреса масиву пікселів зображення

– адреса заголовка інформаційного блоку в bmp

– прапор інтерпретації колірної таблиці

– код растрової операції

Область-джерело вказує, яка частина растру виводиться, чи відбувається дзеркальне відображення по горизонталі та / або по вертикалі Область-приймач задає місце на поверхні зображення графічного пристрою, область-приймач також можна дзеркально відобразити і масштабувати Якщо розміри областей джерела і приймача збігаються, то висновок растра відбувається без масштабування Спосіб додавання нових або видалення непотрібних пікселів зберігається в контексті пристрою і може бути змінений функцією SetStretchBltMode Так, можливо обчислювати середній колір по групі пікселів, комбінувати пікселі за допомогою побітових логічних операцій, відкидати зайві пікселі

Прапор інтерпретації колірної таблиці показує, що саме містить ця таблиця компоненти RGB або індекси квітів в логічній палітрі

Код растрової операції показує спосіб копіювання з області-джерела в область-приймач Найпростішим кодом є SRCCOPY, що задає копіювання без додаткових операцій

Функція SetDIBitsToDevice дозволяє виводити растри із збереженням масштабу і орієнтації або повністю, або по рядках

Для роботи з DDB-растрами, є обєктами GDI і зберігаються в памяті GDI, використовуються інші API-функції

Створити DDB-растр можна за допомогою функцій CreateBitmap, CreateBitmapInDirect, CreateCompatibleBitmap Всі ці функції повертають дескриптор растрового обєкта CreateBitmap має наступні параметри

– ширина і висота растра в пікселях

– кількість площин cPlanes для зберігання кольору пікселя

– кількість бітів на 1 піксель cBitsToPxl

– адреса масиву з пікселями

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

Функція CreateBitmapInDirect працює з тими ж параметрами, що і CreateBitmap, однак вони передаються через структуру типу BITMAP Функція CreateCompatibleBitmap створює DDB-растр, сумісний з контекстом заданого пристрою Недоліком трьох розглянутих функцій є те, що вони створюють або монохромний растр з ініціалізацією пікселів, або кольоровий растр без ініціалізації

Для роботи в програмі з ініціалізованих кольоровими растрами кращим виходом є використання ресурсів Ресурсами є піктограми, малюнки, меню, діалогові вікна, курсори і шрифти Вони описуються в зовнішньому текстовому файлі, званому файлом ресурсів і мають розширення гс Різноманітні ресурси описуються в ньому у відповідності зі своїми форматами Для того щоб включити ресурси в * Ехе файл, їх необхідно відкомпілювати спеціальним компілятором ресурсів, який може бути вбудований в інтегроване середовище розробки програм Результатом роботи компілятора ресурсів є файл з розширенням res, який разом з обєктним модулем обробляється редактором звязків для отримання ехе-файла Перевагами використання ресурсів є простота їх редагування і незалежність опису від тексту вихідного модуля, можливість редагування ресурсів безпосередньо в завантажувальному файлі (наприклад, для перекладу пунктів меню на іншу мову), можливість вилучення ресурсів з завантажувального файлу для подальшого використання в інших додатках

Кожному ресурсу при описі присвоюється ідентифікатор ресурсу, який потім використовується API-функціями Наприклад, опис піктограми ICON1ICO має вигляд:

Ідентіфікатор_ресурса ICON [параметри] ICON1ICO

а опис растрового зображення BITMAP1BMP:

Ідентіфікатор_ресурса BITMAP [параметри] BITMAP1BMP У MASM32 використовується числовий ідентифікатор ресурсу

Незважаючи на важливість DDB-растрів, в Windows відсутня функція їх відображення на пристрої виводу Їх висновок здійснюється

шляхом копіювання з одного пристрою на інший як без зміни масштабу (функція BitBlt), так і зі зміною (функція StretchBlt) Пристроєм-приймачем служить вікно, а в якості пристрою-джерела в памяті потрібно створити область, яка за своїми можливостями повинна бути сумісна з екраном і в яку потрібно записати зображення Сумісна з вікном область памяті також повинна мати свій контекст, званий контекстом памяті або сумісним контекстом памяті У контексті памяті зберігаються дескриптори інструментів малювання, які можна замінювати на свої, в контекст памяті можна виводити графіку Відмінністю контексту памяті від контексту вікна є можливість завантаження в контекст памяті дескриптора растрового зображення

Розглянемо реалізацію виведення на екран DDB-растра, описаного як ресурс Для виведення растрового зображення необхідно виконати наступні дії:

1) завантажити растрове зображення в память і запамятати його дескриптор Для цього використовується функція LoadBitmap, першим параметром якої є дескриптор екземпляра додатка, а другий ідентифікатор ресурсу, що описує DIB-растр Функція виділяє память під зображення, завантажує його туди, перетворює в DDB-формат і повертає дескриптор hBmp області памяті з растром Цей крок виконується поза обробки повідомлення WMPAINT Відзначимо, що якщо потрібно працювати із зображенням, розмір якого буде відомий пізніше, то можна зарезервувати необхідний обсяг памяті функцією CreateCompatibleBitmap Завантаження бітового образу можна здійснювати за допомогою функції Loadlmage, завантажувати не тільки растри, але ще піктограми і курсори Loadlmage повертає дескриптор DDB-растра

2) отримати сумісний з вікном контекст пристрою для області памяті, де буде зберігатися зображення, з використанням функції CreateCompatibleDC, єдиним параметром якої є дескриптор контексту пристрою, куди має бути виведено зображення Цей дескриптор hDC або повертається функцією Begin-Paint в обробці WMPAINT, або повинен бути отриманий за допомогою функції GetDC Якщо використовувалася функція GetDC, необхідно після роботи повернути контекст системі за допомогою функції Re-leaseDC

3) включити дескриптор області памяті з растровим зображенням hBmp в сумісний з вікном контекст памяті, використовуючи функцію SelectObject Значення дескриптора растрового зображення за замовчуванням в сумісному контексті потрібно зберегти, хоча він описує

зображення розміром всього в 1 піксель Після цього в сумісну память можна виводити будь-які обєкти, викликати функції малювання

4) Для того щоб відобразити на екрані створене зображення,
необхідно скопіювати його у вікно з використанням функцій BitBIt
або StretchBlt Розглянемо виклик і параметри функції BitBIt Виклик
має вигляд:

BitBIt ​​(hDC, x, у, w, h, memDC, xO, y0, FLAG)

Параметри:

– hDC і memDCдескріптори вікна програми, куди копіюється зображення, і сумісного контексту памяті

– Хо і УО координати початкової точки верхнього лівого кута зображення-джерела, з якої починається копіювання в зображення-приймач Якщо все зображення копіюється цілком, то потрібно вказати нульові значення Хо і УО

– х і у задають координати верхнього лівого кута копії у вікні, рахуючи від початку його клієнтської області

– w і h задають ширину і висоту копируемой прямокутної частини зображення Максимальне значення цих параметрів ширина і висота в пікселях вихідного зображення Характеристики зображення можна отримати за допомогою функції GetObject, яка для растрового зображення заповнює структуру BITMAP, поля якої bmWidth і bmHeight зберігають ширину і висоту зображення

– FLAG зазначає вид операції над бітами зображення і битами області копіювання, що використовується для реалізації мультиплікації У простому випадку FLAG = SRCCOPY, що вказує на копіювання джерела в приймач з затиранням області копіювання Якщо потрібно реалізувати мультиплікацію, то в циклі переміщення обєкта спочатку виводиться зображення з FLAG = SRCCOPY, потім після затримки з FLAG = MERGEPAINT, що дає стирання зображення і отримання білого тла, після чого змінюють координати виводу

Функція StretchBlt дозволяє масштабувати зображення і виконувати його дзеркальні відображення

5) повернути в сумісний контекст памяті старе значення дескриптора бітового зображення

6) Знищити контекст сумісної з вікном області памяті

Ілюструє текст продедур виведення DDB-растра на MASM32:

Paint_Proc proc hWin:DWORD, hDC:DWORD

LOCAL hold:DWORD

LOCAL memDC :DWORD

invoke CreateCompatibleDC,hDC

mov memDC, eax

invoke SelectObject,memDC,hBmp

mov hold, eax

invoke BitBlt,hDC,10,10,166,68,memDC,0,0,SRCCOPY

invoke SelectObject,memDC,hold

invoke DeleteDC,memDC

return 0 Paint_Proc endp

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*