Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Опис складових структур формату DIB
На початку файла формату DIB знаходиться структура BITMAPFILEHEADER, визначена у Windows у такий спосіб: typedef struct tagBITMAPFILEHEADER { WORD bfType; // містить ASCII коди літер BM DWORD bfSize; // розмір DIB-файла у байтах (ігнорується) WORD bfReserved1; // завжди дорівнює 0 WORD bfReserved2; // завжди дорівнює 0 DWORD bfOffBits; // кількість байтів від початку файла до опису графіки } BITMAPFILEHEADER; Хоча ця структура знаходиться на початку дискового файла формату DIB, вона не є обов’язковою частиною растрового зображення в пам'яті. Перший член структури – bfType, ідентифікує файл як формат растрового зображення і має містити ASCII коди двох символів – “ВМ” (дорівнює 4D42 у 16-ковому форматі). Поле є ознакою DIB-файла. Якщо файл не містить зазначеної комбінації, він не розглядається у якості DIB-файла. Другий член – bfSize передбачався як розмір у байтах файла растрового зображення. Однак, через помилку в первинній документації Windows, bfSize має ігноруватися. Член структури bfOffBits містить кількість байтів від початку файла до опису, власне, растрових даних. Наступною структурою є структура BITMAPINFO, визначена Windows у такий спосіб: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO;Як видно, структура BITMAPINFO складається з заголовка, який задається спеціальною BITMAPINFOHEADER та таблиці кольорів у вигляді масиву структури RGBQUAD. У свою чергу BITMAPINFOHEADER є ще однією структурою, також визначеною Windows, вона має більш складний вміст і визначені нижче: typedef struct tagBITMAPINFOHEADER { DWORD biSize; // розмір структури в байтах DWORD biWidth; // ширина зображення у пікселях DWORD biHeight; // висота зображення у пікселях WORD biPlanes; // кількість площин зображення (завжди дорівнює 1) WORD biBitCount; // кількість бітів на піксель DWORD biCompression; // тип стиснення (0 – немає, 1– RLE-8, 2 – RLE-4) DWORD biSizeImage; // розмір зображення у байтах DWORD biXPelsPerMeter; // кількість горизонтальних пікселів/метр DWORD biYPelsPerMeter; // кількість вертикальних пікселів/метр DWORD biClrUsed; // кількість кольорів, що використовуються DWORD biClrImportant; // кількість найбільш важливих кольорів} BITMAPINFOHEADER;Член biSize структури BITMAPINFOHEADER містить її розмір і має дорівнювати 40 байтів. Члени biWidth і biHeight є шириною і висотою растрового зображення у пікселях. Член biPlanes завжди встановлюється у значення 1. biBitCount містить кількість бітів на піксель і приймає значення 1, 4, 8, або 24, що відповідає монохромному, 16-кольоровому, 256-кольоровому та зображенню із 16.7 мільйонів кольорів. Член biCompression містить тип стискання, що використовується у растровому зображенні, де 0 вказує на відсутність стискання; 1 – на метод стискання RLE-8; 2 – на метод RLE-4. Додатково зазначимо, що DIB формат не є взірцем ефективного використання методів стискання даних. Зазвичай дані у DIB-зображеннях взагалі не стискуються і поле biCompression має значення 0. Власне, якщо б *.bmp -файли мали ефективні методи стискання, можливо такі формати, як GIF та JPEG не були б такими поширеними і популярними. Поле biSizeImage є членом, що містить розмір растрового зображення в байтах і звичайно використовується для зображень, що реалізують певний метод стискання. biSizeImage завжди враховує, що кількість байтів у кожному рядку зображення є кратною 4. Інколи для гарантування цієї кратності додаються порожні байти. Однак, якщо метою програми не є створення нового растрового зображення з точки зору розробника це поле не є особливо важливим. Поля biXPelsPerMeter та biYPelsPerMeter містять відповідно горизон-тальну та вертикальну щільність пікселів зображення (вимірювану у пікселях на метр), але звичайно встановлені у значення 0. Члени biClrUsed та biClrImportant містять, відповідно, загальну кількість кольорів, що використовуються у растровому зображенні, і кількість найбільш важливих кольорів. Обидва параметри звичайно встановлені у значення 0. Як можна помітити, члени структури BITMAPINFOHEADER після поля biBitCount найчастіше містять нульові значення. Таким чином, після зчитування файла за диска, ці члени дуже ймовірно ігноруватимуться. Доволі часто, значення, що містяться у цих членах можуть бути обчислені у непрямий спосіб на основі наявних даних. Остання структура, яка привертає увагу при розгляді незалежних растрових зображень – структура RGBQUAD, визначена у такий спосіб: typedef struct tagRGBQUAD { BYTE rgbRed; // щільність червоного кольору BYTE rgbGreen; // щільність зеленого кольору BYTE rgbBlue; // щільність синього кольору BYTE rgbReserved; // резервний член } RGBQUAD; Зміст структури є надзвичайно важливим, незважаючи на простий вигляд. Структура містить інтенсивності червоного, зеленого та синього компонентів кольору. Кожен колір у форматі растрового зображення подається структурою типу RGBQUAD. Таким чином растрове зображення із 16-ма кольорами (4 біти) має таблицю кольорів із 16 структурами типу RGBQUAD структури, одночасно 8-бітне зображення з 256 кольорами матиме таблицю кольорів із 256 RGBQUAD структурами. Виключенням є 24-бітні зображення, які не мають ніякої таблиці кольорів. У структурі файла растрового зображення одразу за заголовком, що визначається BITMAPINFOHEADER, розташовуються – фактичні дані зображення. Розмір цих даних звичайно залежить від розміру зображення.
8.3 Створення CDib класу
Вже зазначалося, що хоча MFC містить класи багатьох графічних об’єктів, жоден повністю не відповідає формату DIB. Хоча створення спеціального класу CDib теоретично виглядає необов’язковим [2] і програму для відкриття *.bmp-файла можна розробити на основі перелічених у попередньому розділі структур, реальна розробка вимагатиме об’єднання усіх непростих властивостей DIB-файла у єдиний клас. Це надасть можливість об’єднання усіх властивостей формату DIB. У літературі [2] та MSDN описуються дещо різні варіанти опису класу CDib. Нижче описується клас програми, що забезпечує відкриття *.bmp-файлів на основі структури проектів, описаних у попередніх розділах. Перш за все слід навести опис самого класу CDib. Його ілюструє приклад 8.1. До складу класу CDib входять покажчики на структури, що є складовими формату DIB: LPBITMAPFILEHEADER m_pBmFileHeader; LPBITMAPINFO m_pBmInfo; LPBITMAPINFOHEADER m_pBmInfoHeader; таблиця кольорів RGBQUAD *m_pRGBTable; та, власне, дані зображення BYTE * m_pDibBits. Також до складу даних входить параметр кількості кольорів растрового зображення: UINT m_numColors.
Приклад 8.1 – Вигляд класу CDib class CDib: public CObject {protected: LPBITMAPFILEHEADER m_pBmFileHeader; LPBITMAPINFO m_pBmInfo; LPBITMAPINFOHEADER m_pBmInfoHeader; RGBQUAD* m_pRGBTable; BYTE* m_pDibBits; UINT m_numColors; public: CDib(const char* fileName); ~CDib(); DWORD GetDibSizeImage(); UINT GetDibWidth(); UINT GetDibHeight(); UINT GetDibNumColors(); LPBITMAPINFOHEADER GetDibInfoHeaderPtr(); LPBITMAPINFO GetDibInfoPtr(); LPRGBQUAD GetDibRGBTablePtr(); BYTE* GetDibBitsPtr(); protected: void LoadBitmapFile(const char* fileName); };
Подібно більшості класів, CDib має конструктор і деструктор: CDib(const char* fileName); ~CDib();Зазначимо лише, що параметром конструктора є ім’я файла (із розширенням *.bmp), на основі якого будується об’єкт типу CDib. Окрім, власне, даних, клас CDib містить ряд функцій, важливих з точки зору роботи програми даних. Вони розміщені у розділі public класу і описані у таблиці 8.1:
Таблиця 8.1 – Основні функції класу CDib
Клас CDib має одну функцію у захищеній частині класу – LoadBitmapFile(). Вона викликається у непрямий спосіб і завантажує файл формату DIB.
|