Skip to content

DHushchin/Assignment_4

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Варіант #1. Обробка зображень

Завдання полягає в збільшенні зображення в задану цілу кількість разів. На вхід програмі подаються імена вхідного та вихідного файлів, а також число. Ваша програма має працювати з форматом BMP. Для збільшення зображення не обов'язково використовувати складні алгоритми – достатньо лише кілька разів копіювати пікселі.

Складніше завдання (+1 бал): Збільшувати та зменшувати зображення в нецілу кількість разів, використовуючи інтерполяцію

Формат файлів BMP

Програма має працювати з 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-редакторі (заголовки позначені виділенням):

Посилання

Питання та необхідні знання

Третя робота має на меті познайомити вас із роботою з бінарними файлами та з основами об'єктно орієнтованого програмування. Використання інкапсуляції є обов'язковою умовою для здачі лабораторної роботи.

Серед інформації, у якій слід розібратися:

  • Endianess; little- та big-endian порядок байтів
  • Принципи ООП. Навіщо використовуються об'єкти і класи. Спойлер: "тому що ми звикли сприймати і працювати з об'єктами в реальному світі" – зовсім неправильна відповідь
  • Single Responsibility Principle

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

About

Binary files. OOP. Encapsulation. Resizing BMP.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages