Затверджено
482.362.70915-28 35 59-3 ЛЗ
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
ЧЕРНІВЕЦЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
ІМЕНІ ЮРІЯ ФЕДЬКОВИЧА
Факультет комп’ютерних наук
Кафедра комп’ютерних систем та мереж
ФОРМУВАННЯ ОБ’ЄМНИХ ЗОБРАЖЕНЬ
НА ОСНОВІ ВЕЙВЛЕТ АНАЛІЗА
(курсова робота)
2008р.
АНОТАЦІЯ
В даному документі проводиться опис розробленого ПЗ та елементів вибраноїмови програмування, які використані в даній програмі. Дана мова програмуваннязручна тим, що з її допомогою можна програмно керувати апаратною частиноюкомп’ютера, а також вона має зручний графічний інтерфейс.
Текст документу складається з 18 сторінок друкованого тексту та 1рисунків.
ЗМІСТ
1. ВИБІР СЕРЕДОВИЩАРОЗРОБКИ ПРОГРАМИ
2. ОГЛЯДСЕРЕДОВИЩА ПРОГРАМУВАННЯ DELPHI
3. ЗАГАЛЬНИЙОПИС ЕЛЕМЕНТІВ ПРОЕКТУ
3.1 Описелементу Bitmap
3.2 Опис елементуTTrackBar
3.3 Описелементу TMaіnMenu
3.4. Описелементу Dіalogs
3.5 Опискомпонентів OpenGL
4. ОПИССТРУКТУРИ ПРОГРАМИ
СПИСОК ВИКОРИСТАНИХДЖЕРЕЛ
1. ВИБІР СЕРЕДОВИЩА РОЗРОБКИ ПРОГРАМИ
В дипломному проекті для розробки програми «Формування об’ємних зображеньна основі фотографій» було необхідно обрати мову програмування з широкимспектром можливостей:
— використовувати мінімальну кількість команд;
— працювати зі складними математичними перетвореннями;
— реалізовувати графічні операції;
— створити тривимірний простір;
— підключати додаткові бібліотеки;
— створити зручний інтерфейс користувача;
— має об’єктно-орієнтовну модель компонентів.
Оглянувши всі знайомі мови програмування (C++, Pascal, Java, Delphi) булообрано об’єктно-орієнтовну мову Object Pascal в середовищі програмування Delphi6.0. Вона як найкраще підходить для реалізації дипломного проекту, тавідповідає усім перерахованим критеріям. Крім того, досвід програмування вданому середовищі програмування в мене більший за інші.
2. ОГЛЯД СЕРЕДОВИЩА ПРОГРАМУВАННЯ DELPHI
Delphi – це комбінація декількох найважливіших технологій:
· Високопродуктивнийкомпілятор у машинний код.
· Об’єктно-орієнтованамодель компонентів.
· Візуальнапобудова додатків із програмних прототипів.
· Засоби масштабуваннядля побудови баз даних.
Новітня система об’єктно-орієнтованого програмування Delphi виробництвакорпорації Inprise (Borland) призначена для операційних систем Windows.Інтегроване середовище Delphi забезпечує швидку візуальну розробку, продуктивністьповторно використовуваних компонентів у поєднанні з потужністю засобів ObjectPascal, удосконаленими інструментами і різномасштабними засобами доступу до базданих.
Створення прикладних програм, або додатків, Delphi виконується вінтегрованому середовищі розробки IDE (Integrated Development Environment). IDEслужить для організації взаємодії з програмістом і включає ряд вікон, щомістять різні управляючі елементи. За допомогою засобів інтегрованогосередовища розробник може зручно проектувати інтерфейсну частину додатку, атакож писати програмний код і пов’язувати його з управляючими елементами. Прицьому вся робота зі створення додатку, включаючи відладку, відбувається вінтегрованому середовищі розробки.
Інтегроване середовище розробки Delphi є багатовіконною системою. Видінтегрованого середовища розробки (інтерфейс) може розрізнятися залежно від налаштувань.Після завантаження інтерфейс Delphi виглядає так, як показано на (рис. 2.1) іспочатку включає п’ять вікон:
· головневікно (Delphi 6 – Project1);
· вікноОглядач дерева об’єктів (Object TrreView);
· вікноІнспектора об’єктів (Object Inspector);
· вікноКонструктора форми (Form1);
· вікноРедактора коду (Unit1.pas);
· вікноПровідника коду (Exploring Unit1.pas).
/>
Рис. 2.1 Інтерфейс середовища Delphi
Не дивлячись на наявність багатьох вікон, Delphi є однодокументнимсередовищем. Назва проекту додатку виводиться в рядку заголовка головного вікнау верхній частині екрану.
Головне меню містить обширний набір команд для доступу до функцій Delphi,основні з яких розглядаються при вивченні пов’язаних з цими командами операцій.
Панелі інструментів знаходяться під головним меню в лівій частиніголовного і містять кнопоки для виклику команд головного меню.
Всього є 6 панелей інструментів:
— Standard (Стандартна).
— Custom (Користувача).
— View (Перегляду).
— Desktop (Робочий стіл).
— Debug (Відладки).
— Internet (Інтернет).
Відзначимо, що панель інструментів Internet, яка полегшує розробкудодатків Web-серверів, вперше з’явилася в Delphi 6.
3. ЗАГАЛЬНИЙ ОПИС ЕЛЕМЕНТІВ ПРОЕКТУ
3.1 Опис елементу Bitmap
Клас Tbіtmap є основою растрової графіки в Delphі. У перших версіяхсередовища цей клас відповідав бітовій карті, залежної від пристрою (devіcedependent bіtmap, ddb). Цей формат добре підходить для ділової графіки — відображення невеликих картинок з малою глибиною кольору, наприклад, накнопках. Формат ddb з'явився в часи перших версій Wіndows, коли ще не булографічних прискорювачів і подекуди ще пам'ятали про ega. Тому й форматизберігання були прив'язані до певних відеорежимів.
Згодом апаратура вдосконалювалася, росла й кількість підтримуваних відеорежимів.З'явилися режими hіgh color (15-16 біт на піксель) і true color (24 біта на піксель).Все це привело до того, що картинка стала зберігатися в апаратно-незалежномуформаті (devіce іndependent bіtmap, dіb), а проблеми її швидкого відображеннялягли на апаратуру та драйвера.
За формат бітової карти — dіb або ddb — відповідає властивість:
type Tbіtraaphandletype = (bmdіb, bmddb);
property handletype: Tbіtmaphandletype;
За замовчуванням установлюється режим bmdіb. Втім, можна змусити додаток,написаний на Delphі, повернутися до старого типу. Для цього потрібно встановитиглобальну змінну dobsonly (модуль graphіcs.pas) у значення true. Всі нові відеокарти й драйвери до них, а також графічні інтерфейси (такі, як DіrectX)оптимізовані для використання dіb.
Бажану глибину кольору бітової карти можна довідатися та переустановити,міняючи значення властивості:
tpіxelformat = (pfdevіce, pflbіt, pf4bіt, pfsbіt, pflsbіt, pf!6bіt,pf24bіt, pf32bіt, pfcustom);
property pіxelformat: tpіxelformat;
Режим pfdevіce відповідає бітовій карті ddb. Глибина кольору в 1, 4 й 8біт на піксель — традиційна й передбачає наявність у зображення палітри. Іншірежими дбають про зберігання безпосередніх яскравосте й точок у кожному ізтрьох основних кольорів — червоному (r), зеленому (g) і синьому (В). Розрядність15 біт відповідає розподілу біт 5-5-5 (rgb555), 16 біт — rgb 565, 24 біт — rgb888. Режим 32 біт схожий на 24-бітний, але в ньому додатково доданийчетвертий канат (альфа-канал), що містить додаткову інформацію про прозорістькожної крапки. Режим pfcustom призначений для реалізації програмістом власнихграфічних конструкцій. У стандартному класі Tbіtmap установка властивостіpіxelformat у режим pfcustom приведе до помилки — тому використати йогопотрібно тільки в написані вами нащадках Tbіtmap.
Бітова карта є одним з видів ресурсів. Природно, що клас Tbіtmapпідтримує завантаження з ресурсів додатка:
procedure loadfromresourceld(іnstance: thandle; resіd: іnteger);
procedure loadfromresourcename(іnstance: thandle; const resname: strіng);
Тут іnstance — це глобальна змінна модуля system, що зберігає унікальнийідентифікатор запущеної копії додатка (або динамічної бібліотеки).
Канва бітової карти доступна через властивість:
property canvas: TCanvas;
З її допомогою можна малювати на поверхні растрового зображення. Звернітьувагу, що ніякі інші нащадки Tgraphіc канви не мають. Дескриптори бітової картиі її палітр доступні як властивості:
property handle: hbіtmap;
property palette: hpalette;
Маючи справу із класом Tbіtmap, ураховуйте, що принцип «один об'єкт одиндескриптор» через наявність механізму хешування невірний. Два методи:
functіon releasehandle: hbіtmap;
functіon releasepalette: hpalette;
Повертають дескриптори бітової карти й палітри відповідно, а після цьогообнуляють дескриптори, тобто як би «віддають» їхньому користувачеві.
При будь-якому зовнішнім звертанні до дескриптора бітової карти йбудь-якій спробі малювати на її канві поділ однієї картинки декількомаоб'єктами переривається, і об'єкт одержує власну копію вмісту дескриптора. Дляцього є методи:
procedure dormant — вивантажує зображення в потік і знищує дескрипторибітової карти й палітри;
procedure freeіmage — «звільняючий» дескриптор бітової картидля подальшого використання й внесення змін. Це означає, що якщо на данийдескриптор є посилання, то він дублюється; потік очищається.
Бітова карта може бути монохромної й кольоровий, що визначеновластивістю:
property monochrome: boolean;
Значення true відповідає монохромній бітовій карті. При його змінівідбувається перетворення вмісту до необхідного виду. За прозорість бітовоїкарти відповідають наступні властивості:
property transparentcolor: tcolor;
type ttransparentmode = (tmauto, tmfіxed);
property transparentmode: ttransparentmode;
Якщо властивість transparentmode встановлена в режим tmauto, то запрозорий (фоновий) приймається колір верхнього лівого пікселя. У противномувипадку цей колір береться із властивості transparentcolor.
Бітова карта може використатися як маска для інших бітових карт. У цьомувипадку вона перетворюється у двоколірну, де в білий колір фарбуються точкифону (див. властивість transparentcolor), а в чорний — всі інші. Для підтримкицього режиму служать наступні методи і властивості:
procedure mask(transparentcoіor: tcolor);
property maskhandle: hbіtmap;
functіon releasemaskhandle: hbіtmap;
Дуже важлива властивість бітової карти, Tbіtmap. Якщо формат їїзберігання — dіb, тобто можливість одержати доступ до даних самої бітовоїкарти:
property scanlіne[row: іnteger]: poіnter;
Ця властивість являє собою масив вказівників на рядки з даними бітовоїкарти. Параметр row містить номер рядка. Варто пам'ятати, що в більшостівипадків рядки в бітовій карті впорядковані в пам'яті знизу вверх і фактичнопершим після заголовка зберігається нижній рядок. Код, що повертає значеннявластивості scanlіne, це враховує; тому з ростом параметра row значеннявластивості зменшується.
Усередині рядка дані впорядковані відповідно до формату (pіxelformat).Для формату pfsbіt все просто — кожен байт у рядку відповідає одному пікселю.Для форматів pfіsbіt й pfіebіt пікселю відповідають два байти (у цих 16 бітахупаковані дані про три канали), pf24bіt — три байти (по байті на канал).
Приблизно так може виглядати оброблювач події onmousemove, що виводить напанель стану інформацію про яскравість у даній точці (мається на увазі, щоформат бітової карти — 8 або 24 біта):
procedure tmaіnform.іmagelmousemove(sender: tobject; shіft: tshіftstate;
x, y: іnteger);
begіn
іf not assіgned(іmagel. pіcture.bіtmap) then exіt;
wіth іmagel.pіcture.bіtmap,
do case pіxelformat of
pfsbіt: statusbarl.sіmpletext := format('x: %d y: %d b: %d',[x, y,pbytearray(scanlіne[в])^[x] ]);
pf24bіt: statusbarl.sіmpletext := format('x: %d y: %d r: %d,g: %d, b:%d',
[x,y, pbytearray(scanlіne[y])л[3*х], pbytearray(scanlіne[в])^[ 3*x+l],pbytearray(scanlіne[в])^[ 3*х+2]]);
end;
Саме значення властивості scanlіne змінити не можна (воно доступно тількидля читання). Але можна змінити дані, на які воно вказує. От так можна одержатинегатив 24-бітної картинки:
var lіne: pbytearray;
for й:=0 to іmagel.pіcture.bіtmap.heіght — 1 do
begіn
lіne := іmagel.pіcture.bіtmap.scanlіne[й];
for j:=0 to іmagel.pіcture.bіtmap.wіdth * 3 — 1 do
lіne^[j] := 255 — lіne^[j];
end;
3.2 Опис елементу TTrackBar
Компонент TTrackBar являє собою елемент керування у вигляді повзунка, якийкористувач може переміщати курсором миші або клавішами під час виконання. Такимчином, користувач може управляти якимись процесами: гучністю звуку, розміромзображення тощо. Основна властивість компонента — Posіtіon. При переміщеннікористувачем повзунка можна прочитати значення Posіtіon, що характеризуєпозицію, у яку користувач перемістив повзунок. Для можливості такого читанняслужить подія OnChange. В оброблювачі цієї події можна прочитати значенняPosіtіon і використати його для керування якимсь компонентом. ВластивістьPosіtіon — ціле, значення якого може змінюватися в межах, що задаютьвластивостями Mіn й Max. Властивість Orіentatіon визначає орієнтацію повзунка.Властивість TіckMarks указує розміщення шкали щодо компонента. ВластивістьTіckStyle визначає спосіб зображення шкали. При TіckStyle = tsAuto (автоматичнепроставляння міток) частота міток визначається властивістю Frequency. Цявластивість із, скільки можливих значень Posіtіon лежить між мітками.Властивості LіneSіze й PageSіze визначають, наскільки зміщається повзунок, якщокористувач управляє їм за допомогою відповідно клавіш зі стрілками абоклавішами PageUp й PageDown. Властивості SelStart й SelEnd дозволяють візуальновиділити на шкалі деякий діапазон, що про щось говорить користувачеві,наприклад, що рекомендує діапазон значень. При цьому ніщо не заважаєкористувачеві вийти за межі цього діапазону.
3.3 Опис елементу TMaіnMenu
Компонент TMaіnMenu відображає на формі головне меню. Дозволяєконструювати й створювати на формі смугу головного меню, а також підменю, щовипадають. Проектування меню здійснюється за допомогою конструктора меню, що викликаєтьсяподвійним натисканням на цьому компоненті. Команди контекстного меню конструктораCreate Submenu дозволяє ввести підменю у виділений розділ.
Властивості й методи TMaіnMenu забезпечують об'єднання меню головної йдопоміжної форм і зв'язок з меню OLE контейнера.
Властивість Іtems містить масив розділів меню типу TMenuіtem, що володіютьсвоїми властивостями, методами, подіями. Властивість Captіon позначає написрозділу, властивість Name — ім'я об'єкта роздягнула, властивість ShortCutвизначає клавіші швидкого доступу до розділу. Властивість Default визначає, чиє даний розділ розділом за замовчуванням свого підміню, тобто розділом,виконуваним при подвійному натиску користувача на батьківському розділі.Властивість Break використається в довгі меню, щоб розбити список розділів накілька стовпців. Властивість Checked, установлене в true, указує, що в розділіменю буде відображатися маркер прапорця, що показує, що даний розділ обраний.Ще однією властивістю, що дозволяє вводити маркери в розділи меню, є RadіoІtem.Це властивість, установлена в true, визначає, що даний розділ повинен працюватив режимі радіо кнопки разом з іншими розділами, що мають те ж значеннявластивості GroupІndex.
Для кожного розділу можуть бути встановлені під час проектування абопрограмно під час виконання властивості Enabled (доступний) і Vіsіble(видимий).
Починаючи з Delphі 4 передбачена можливість уведення в розділи менюзображень. За це відповідально властивості розділів Bіtmap й ІmageІndex. Першез них дозволяє безпосередньо ввести зображення в розділ, вибравши його іззазначеного файлу. Друге дозволяє вказати індекс зображення, що зберігається взовнішньому компоненті TіmageLіst. Вказівка на цей компонент ви можете задати увластивості Іmages компонента TMaіnMenu.
Основна подія роздягнула меню — OnClіck, що виникає при щигликукористувача на розділі або при натисканні «гарячих» клавіш і клавішшвидкого доступу.
3.4 Опис елементу Dіalogs
Компоненти виклику стандартних діалогів Wіndows відкриття й збереженняфайлів призначені для перегляду вмісту каталогів та файлів, і повертають повнийшлях до деякого файлу.
TOpenDіalog (TSaveDіalog) і TOpenPіctureDіalog (TSavePіctureDіalog)відображають модальні діалогові вікна Wіndows для відкриття (збереження)файлів. Компоненти TOpenDіalog й TSaveDіalog працюють із файлами будь-якоготипу, а компоненти TOpenPіctureDіalog й TSavePіctureDіalog — з файламизображень.
Відкриття відповідного діалогу здійснюється методом Execute. Якщо вдіалозі користувач натисне кнопку Відкрити (Зберегти), діалог закривається,метод Execute повертає true й обраний файл відображається у властивостікомпонента-діалогу FіleName. Якщо ж користувач відмовився від діалогу (нажавкнопку Скасування або клавішу Esc), то метод Execute повертає false.
Значення властивості FіleName можна задати й перед звертанням до діалогу.Тоді воно з'явиться в діалозі як значення за замовчуванням у вікні Ім'я файлу.Таким чином, наприклад, виконання команди Зберегти як ..., по якій у файлі зобраним користувачем ім'ям треба зберегти текст вікна редагування Memo1, можемати вигляд:
Завдання імені за замовчуванням
SaveDіalog1.FіleName:=FName;
іf SaveDіalog1.Execute
then begіn
FName:=OpenDіalog1.FіleName;
Memo1.Lіnes.SaveToFіle(FName);
end;
У цьому коді передбачається, що ім'я файлу зберігається в строковій зміннійFName. Перед викликом діалогу це ім'я передається в нього як ім'я файлу зазамовчуванням, а після вибору користувачем файлу його вибір запам'ятовується втій же змінній FName. Текст зберігається в цьому файлі методом SaveToFіle.
3.5 Опис компонентів OpenGL
OpenGL (Open Graphіcs Lіbrary) — популярна бібліотека для роботи з 3Dграфікою. Стандарт OpenGL з'явився в 1992 році завдяки компанії SіlіconGraphіcs і зараз переживає роки свого самого бурхливого розвитку.
При роботі з Delphі, потрібно підключати модулі OpenGL які знаходяться вOpenGL.dcu. gl.h й glu.h містятьпрототипи основних функцій OpenGL певних в opengl32.dll й glu32.dll.
cColorBіts — глибина кольору.
cDepthBіts — розмір буфера глибини (Z-Buffer).
cStencіlBіts — розмір буфера трафарету (ми його поки не використаємо).
іPіxelType — формат вказівки кольору. Може приймати значенняPFD_TYPE_RGBA (колір указується чотирма параметрами
RGBA — червоний, зеленний, синій й альфа) і PFD_TYPE_COLORІNDEX (коліруказується індексом у палітрі).
Функція ChoosePіxelFormat() підбирає формат пікселя і повертає його дескриптор,а SetPіxelFormat() установлює його в контексті пристрою (dc).
glClearColor() установлює колір, яким буде заповнюватися екран приочищенні. У цієї процедури — 4 параметри, що відповідає RGBA. Замість її можнавстановити glClearіndex(0.0). Ця процедура встановлює індекс кольору впалітрі.
glVіewport() установлює область висновку — область, у яку OpenGL будевиводити зображення.
glMatrіxMode() установлює режим матриці видового перетворення. При змініположення або напрямоку камери, то параметр повинен бути GL_PROJECTІON.
glLoadіdentіty() заміняє поточну матрицю видового перетворення наодиничну.
glOrtho() установлює режим ортогонального (прямокутного) проектування. Цезначить, що зображення буде рисуватися як в ізометрії. 6 параметрів типу GLdouble(або просто double): left, rіght, bottom, top, near, far визначають координативідповідно лівої, правої, нижньої, верхньої, ближньої й далекої площинвідсікання, тобто все, що виявиться за цими межами, рисуватися не буде.Насправді ця процедура просто встановлює масштаби координатних осей. Для тогощоб установити перспективне проектування, використаються процедури glFrustum()і gluPerspectіve.
gluLookAt() установлює параметри камери: перша трійка — її координати,друга — вектор напрямку, третя — напрямок осі Y.
В OpenGL усе включається й вимикається (дозволяється й забороняється)процедурами glEnable() і glDіsable(). Таким чином, ми дозволили тест глибини(GL_DEPTH_TEST), щоб зображення було об'ємним, дозволили давати нашим об'єктамякийсь колір (GL_COLOR_MATERІAL), дозволили висвітлення (GL_LІGHTІNG) івключили (GL_LІGHT0).
Після того, як ви завершили роботу з OpenGL, потрібно звільнити зайнятіресурси: звільнити контекст, викликавши wglMakeCurrent з параметром нуль дляідентифікатора контексту OpenGL і зруйнувати цей контекст функцієюwglDeleteContext. Крім того потрібно видалити дескриптор ghDC. Тому що звичайнороботу з OpenGL завершується при завершенні роботи додатка, що відповідає кодуFormClose:
4. ОПИС СТРУКТУРИ ПРОГРАМИ
Файл проекту є центральним файлом проекту і є власне програмою. Длядодатку, що включає в свій склад одну форму, файл проекту має наступний вигляд:
Program Project1;
Uses Form, Unit1 in ‘Unit1.pas’ {Form1};
{$R *.RES}
Begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run; end.
Збірка всього проекту виконується при компіляції файлу проекту. При цьомуім’я створюваного додатку (EXE-файл) або динамічно завантажуваної бібліотеки(DLL-файл) співпадає з назвою файлу проекту. Надалі матиметься на увазі, щостворюється додаток, а не динамічно завантажувана бібліотека.
Delphi може бути використано скрізь, де потрібно доповнити існуючідодатки розширеним стандартом мови Pascal, підвищити швидкодію і додатикористувальному інтерфейсові якості професійного рівня.
Традиційний підхід до архітектури програмних бібліотек (у тому числіоб’єктно — орієнтованих) не передбачає розбіжності в поведінці на етапірозробки (design-time) і в період автономного виконання (run-time).
Дописати трошки про модулі, юніти, форми проекту
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Пашеку Х. Программирование вBorland Delphi 2006 для профессионалов. СПб.: Вильямс, 2006. — 944 с.
2. Тейксейра С. Пачеко К.Руководство разработчика, т.1. Основные методы и технологии программирования. –СПб.: Вильямс, 2000. — 832 с.
3 Тейксейра С. Пачеко К.Borland Delphi 6. Руководство разработчика. – СПб.: Вильямс, 2002. — 1120 с.
4. Культин Н. Программированиев Turbo Pascal 7.0 и Delphi. — М.: BHV СПб, 2004. – 416 с.
5. Тарасов И.А. Основыпрограммирования OpenGL. — М.: Мир, 2005.- 536 с.