Завдання полягає в збільшенні зображення в задану цілу кількість разів. На вхід програмі подаються імена вхідного та вихідного файлів, а також число. Ваша програма має працювати з форматом BMP. Для збільшення зображення не обов'язково використовувати складні алгоритми – достатньо лише кілька разів копіювати пікселі.
Складніше завдання (+1 бал): Збільшувати та зменшувати зображення в нецілу кількість разів, використовуючи інтерполяцію
Програма має працювати з bmp файлами, які зберігають колір у форматі 24 бітів на піксель.
Типи intX_t використовуються для представлення цілих чисел з незалежним від розрядності ОС розміром. На свій страх і ризик ви можете використовувати типи відповідного розміру char, int, short, long, byte, які насправді залежать від розрядності вашої ОС та опцій компіляції.
Файл починається із заголовка, який можна представити у вигляді C-структури
typedef struct {
int8_t id[2]; // Завжди дві літери 'B' і 'M'
-> int32_t filesize; // Розмір файла в байтах
int16_t reserved[2]; // 0, 0
int32_t headersize; // 54L для 24-бітних зображень
int32_t infoSize; // 40L для 24-бітних зображень
-> int32_t width; // ширина зображення в пікселях
-> int32_t depth; // висота зображення в пікселях
int16_t biPlanes; // 1 (для 24-бітних зображень)
int16_t bits; // 24 (для 24-бітних зображень)
int32_t biCompression; // 0L
int32_t biSizeImage; // Можна поставити в 0L для зображень без компрессії (наш варіант)
int32_t biXPelsPerMeter; // Рекомендована кількість пікселів на метр, можна 0L
int32_t biYPelsPerMeter; // Те саме, по висоті
int32_t biClrUsed; // Для індексованих зображень, можна поставити 0L
int32_t biClrImportant; // Те саме
} BMPHEAD;
Скоріше за все вам знадобляться лише поля, позначені стрілкою. Далі йде інформація про пікселі у вигляді масиву з таких структур:
typedef struct {
int8_t redComponent;
int8_t greenComponent;
int8_t blueComponent;
} PIXELDATA;
Через неймовірну винахідливість авторів формату розмір у байтах кожного рядка пікселів має ділитися на 4. Тому якщо кількість пікселів у рядку помножена на 3 (розмір PIXELDATA) не ділиться на 4, необхідно дописувати ще кілька нульових байтів у кінець кожного рядка. Докладніше про те, як це зробити, можете прочитати тут
Припустимо, що ваша програма компілюється в resize.exe. Тоді її треба запускати наступним чином:
> resize.exe input.bmp output.bmp 3
Enlarging image 3 times... Done.
Written result to output.bmp
Приклад вхідного та вихідного зображень, а також дамп початкових байтів першого зображення у hex-редакторі (заголовки позначені виділенням):
- RGB-кодування
- Формат BMP на вікі
- Докладний опис формату
- Ще один простий опис
- Схоже завдання на cs50, із ну дуже простим поясненням формату
- Білінійна інтерполяція, в статті також йдеться про інші види інтерполяцій. Ви можете використати будь-яку з них, проте для зображень підходять лише 2-вимірні, наприклад бікубічна. У програмах обробки зображень, наприклад, Photoshop, використовується також фільтр Ланцоша.
Третя робота має на меті познайомити вас із роботою з бінарними файлами та з основами об'єктно орієнтованого програмування. Використання інкапсуляції є обов'язковою умовою для здачі лабораторної роботи.
Серед інформації, у якій слід розібратися:
- Endianess; little- та big-endian порядок байтів
- Принципи ООП. Навіщо використовуються об'єкти і класи. Спойлер: "тому що ми звикли сприймати і працювати з об'єктами в реальному світі" – зовсім неправильна відповідь
- Single Responsibility Principle
Ваша програма має бути доцільним чином розділена на класи, кожен з яких (якнайбільше) відповідає SRP