User Tools

Site Tools


dydaktyka:cprog:2015:photoshop

This is an old revision of the document!


Projekt - Fotoszop

Nazwałem ten projekt “Fotoszop” oczywiście ze względu na prawną ochronę nazwy handlowej programu Photoshop firmy Adobe…

Tytułem wstępu...

Pierwsze komputery powstały nie jako teoretyczne zabawki, tylko jako odpowiedź na bardzo konkretne problemy:

  • Jak sprawnie wykonywać rachunki?
  • Pod jakim kątem wystrzelić torpedę, aby trafić poruszający się okręt?
  • Jak złamać szyfr wroga?

Wychodząc z podobnego założenia chciałbym, umożliwić Ci w ramach przedmiotu “Programowanie komputerów” poćwiczyć pisanie programów służących czemuś bardziej praktycznemu niż wypisywanie "Hello world!" na ekran.

Idea projektu

Program powstały w ramach projektu Fotoszop, jak nazwa sugeruje, będzie służył do pracy z obrazami. W ramach kolejnych ćwiczeń laboratoryjnych zaimplementujesz1) fragmenty kodu służące do wczytywania/zapisu danych obrazu oraz do operowania na pikselach. Umożliwi Ci to wykonywanie takch operacji jak: rozmycie (zmniejszenie ostrości) obrazu, znajdowanie krawędzi na obrazie, tworzenie fraktali – i co Ci jeszcze przyjdzie do głowy :-)

Podczas realizacji projektu zapoznasz się z takimi kwestiami, które występują podczas pisania programu z prawdziwego zdarzenia, jak:

  • praca z “dokumentacją”, zawierającą wskazówki i wytyczne odnośnie pożądanej funkcjonalności
  • opracowanie metody (algorytmu) rozwiązywania problemu
  • przełożenie algorytmu na kod programu z uwzględnieniem ograniczeń sprzętowych
  • weryfikacja poprawności algorytmu – zazwyczaj metodą prób i błędów

Projekt będzie tworzony zgodnie z regułą KISS, stąd:

  • program będzie obsługiwał tylko obrazy w odcieniach szarości w 8-bitowej głębi koloru, zapisane w formacie BMP
  • pewna część funkcjonalności programu – wymagająca wiedzy wykraczającej poza ramy przedmiotu – zostanie dostarczona (przez prowadzącego)

Ograniczenie “obrazy w odcieniach szarości w 8-bitowej głębi koloru” pozwala na znaczne uproszczenie zadań – dzięki temu obraz może być reprezentowany jako dwuwymiarowa tablica wartości z zakresu $[0,255]$. Wartości przykładowych odcieni w skali szarości:

Architektura programu

Biblioteka "bmplib"

Program korzysta z osobnej biblioteki służącej do odczytu i zapisu danych z pliku bitmapy2). W zależności od laboratorium biblioteka ta zawiera również pewne dodatkowe funkcje (np. służące do tworzenia nowego obrazu wewnątrz programu).

Aby móc używać tejże biblioteki, na początku kodu programu znajduje się linia dołączająca jej plik nagłówkowy:

#include "bitmap.h"

To instrukcja analogiczna do znanego Ci już #include <…>, a różnica polega na tym, że:

  • #include <file> oznacza “zacznij szukanie pliku nagłówkowego file w standardowych lokalizacjach”, natomiast
  • #include "file" oznacza “zacznij szukanie pliku nagłówkowego file od katalogu zawierającego bieżący plik, a dopiero potem w standardowych lokalizacjach

Pliki bitmap, na których operuje program, powinny znajdować się w katalogu imgs.
Aby załadować inny obraz niż domyślny (lena.bmp) zmień odpowiednio pierwszy argument funkcji load_bitmap().
Podobnie, aby zapisać przetworzony obraz do innego pliku niż domyślny (lena-out.bmp) zmień odpowiednio pierwszy argument funkcji save_bitmap().

Typ "byte"

Ponieważ zgodnie z ograniczeniami wartość piksela zawiera się w przedziale $[0,255]$, do jego reprezentacji wystarczy jeden bajt – można użyć więc typu unsigned char.

Aby jednak intencja programisty była jasna – że chodzi o piksel – został zdefiniowany typ byte jako alias dla unsigned char. Oznacza to, że zamiast pisać w każdym miejscu unsigned char, można po prostu napisać byte, natomiast dla kompilatora oznacza to dokładnie to samo (jednobajtowa liczba całkowita bez znaku).

Alias utworzono z użyciem instrukcji

typedef unsigned char byte;

Ćwiczenia

Realizacja zadań w ramach każdego z ćwiczeń opiera się na uzupełnieniu dostarczonego (przez prowadzącego) kodu projektu. Link do odpowiedniego projektu znajduje się na początku każdego z laboratoriów.
Miejsca w kodzie, które należy uzupełnić zostały opatrzone stosownym komentarzem:

/* TODO: Uzupełnij mnie! */

Fragmenty do uzupełnienia znajdują się jedynie w pliku .c danego ćwiczenia.

:!: Nie zmieniaj niczego w pozostałym kodzie programu!

Ćwiczenia są od siebie niezależne, a więc na przykład:
Początkowy kod źródłowy ćwiczenia nr 2 zawiera funkcjonalność z ćwiczenia nr 1 – brakuje w nim jedynie tego, o czym mowa w ćwiczeniu nr 2.


1)
zobacz znaczenie w SJP PWN
2)
Autorem oryginalnego kodu biblioteki jest Michael Sweet. Kod ten można znaleźć na stronie http://paulbourke.net/dataformats/bmp/
dydaktyka/cprog/2015/photoshop.1448486639.txt.gz · Last modified: 2020/03/25 11:46 (external edit)