Skip to content

Latest commit

 

History

History
60 lines (44 loc) · 10.4 KB

File metadata and controls

60 lines (44 loc) · 10.4 KB
Практична робота №1

Розробка програми для конвертації зображень різних форматів

Мета роботи

  1. Розібратися з різними форматами зберігання зображень;
  2. Вивчити (або закріпити) принципи побудови програм з плагінами;

Що треба зробити

Необхідно реалізувати консольну програму, яка конвертує зображення між різними форматами та приймає наступні аргументі командного рядка:

  • --source - вхідний файл для конвертації (шлях до файлу)
  • --goal-format - вихідний формат для конвертації (напр. Png або Bmp32)
  • --output - шлях до результату (за замовчуванням використовується ім'я та шлях оригінального файлу з новим розширенням)

Приклад виклику програми:

> Converter.exe --source=example.bmp --goal-format=png

Крім того, програма має обробляти ситуацію спроби відкриття некоректного файлу (файлу з іншим розширенням або з некоректним вмістом) і не завершувати роботу аварійно, а виводити повідомленя про помилку. Наприклад: Error: you are trying to open .tiff file, but only .bmp and . gif files are supported, або Error: you trying to open 8bit BMP file, but only BMP32 is supported

Для заліку роботи потрібно реалізувати щойнайменше два формати файлів (на вибір) - різні формати мають різну складність і тому оцінюються в різну кількість балів. Варіанти форматів:

  1. PPM (portable pixmap format) - найпростіший текстовий формат для зберігання зображення. Файл містить в собі заголовок, що складається з формату, ширини та довжини зображення в пікселях та максимального значення кожної кольорової компоненти M. Після цього у файлі знаходяться трійки значень RGB у діапазоні [0, M] для кожного пікселя зображення. Приклад файлу:
P3
# Image with width 3 and height 2,
# using 0 or 1 per color (red, green, blue)
3 2 1
1 0 0   0 1 0   0 0 1
1 1 0   1 1 1   0 0 0

Формат використовується переважно як допоміжний або проміжний при роботі з іншими типами файлів, детальніше можна почитати у вікі або безпосередньо у специфікації формату

  1. BMP (bitmap image file) - простий та дуже розповсюджений формат, має багато варіацій збереження файлів (різна кількість байт на піксель, можливість стискання тощо). Більш детально можна почитати в описі роботи для першого курсу, там же можна знайти багато посилань на опис формату. В цьому варіанті треба обрати іншу глибину кольору ніж у роботі для першого курсу (НЕ 24 біти, а, наприклад, 16 або 32)
  2. GIF (Graphics Interchange Format) - популярний на зарі розвитку інтернету формат, підтримує анімації, має менший розмір ніж BMP за рахунок використання стискання Lempel-Ziv. На сьогодні використовується переважно для анімованих приколів та мемасів. Детальніше - хабр, вікі, детальна структура
  3. PNG (Portable Network Graphics) - алгоритм, що поступово витіснив GIF у вебі за рахунок більших можливостей у передачі кольорів, прозорості та кращому (у більшості випадків) стисненню змісту. Детальніше можна почитати на хабрі, у вікі та на домашньому сайті формату(і таке буває)
  4. JPEG (Joint Photographic Experts Group) - широко розповсюджений, але і найскладніший (використовує один із видів дискретного перетворення Фур'є) із запропонованих варіант. Специфіка алгоритму з втратами призводить до появи видимих артефактів у місцях різкого перехода кольору, тому найбільше використовується для зображень де такі переходи малопомітні або їх немає - наприклад, цифрові фотографії. Детальніше - хабр, ще хабр, стаття, ще стаття, кодування Хафмана, вікі

Крім власне роботи з форматами, коректна програма має бути побудована за принципом плагінів: високорівневий код перетворення файлів не має оперувати конкретними реалізаціями форматів, а тільки абстракціями. Іншими словами, не дозволяється прямого використання using або import модулів конкретних форматів в програмі-конверторі більше ніж в одному місці (фабриці).

Приклад можливої структури класів у ООП-мові:

В даному випадку програма на високоу рівні оперує інтерфейсами IImageReader та IImageWriter, не знаючи які саме формати в данний момент підтримуються. Підключення формату-плагіна можливо через рефлексію (наприклад, використання атрибутів у C#/анотацій в Java), або через об'єкт фабрику, який єдиний буде знати про всі поточні формати. В залежності від обраної мови програмування вам доведеться самостійно обрати механізм реалізації підключення плагінів

Примітки

  • В наступних роботах ми будемо використовувати зображення різних інших, більш складних форматів, і тому будемо користуватися готовими бібліотеками. В цій роботі читання\запис файлів різних форматів потрібно реалізувати самостійно (крім алгоритмів стисненния у PNG та GIF).
  • Для того щоб здати роботу потрібно зібрати реліз програми під win64 платформу та прикріпити у релізи у вашому гітхаб-репозиторії. Після цього потрібно оновити інформацію для своєї команди в таблиці (вільний доступ) та чекати результатів перевірки роботи.

Оцінювання:

Максимум за роботу можна отримати 16 балів. Мінімальний "набір" балів (9) можна отримати за роботу "гарний код + bmp + ppm". Якщо ваша ціль за підсумками семестру - Е, можете сміливо брати такий варіант. PNG\GIF трохи складніші та дозволяють отримати більше балів, ну those-who-dare варіант з JPEG дозволяє отримати бали з запасом.

  • Якість написання коду - 3 бали. Якщо ви здаєте роботу вчасно і отримуєте не максимум з цього пункту, ви можете доробити\порефакторити роботу і підвищити оцінку;
  • Алгоритм PPM - 3 бали;
  • Алгоритм BMP - 3 балів;
  • Алгоритм PNG та GIF (з використанням бібліотеки для стиснення) - 4 бали . Додатково +1 бал за самостоійну реалізацію
  • Алгоритм JPEG - 8 балів;