This is an old revision of the document!
Nazwałem ten projekt “Fotoszop” oczywiście ze względu na prawną ochronę nazwy handlowej programu Photoshop firmy Adobe…
Pierwsze komputery powstały nie jako teoretyczne zabawki, tylko jako odpowiedź na bardzo konkretne problemy:
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.
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:
Projekt będzie tworzony zgodnie z regułą KISS, stąd:
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:
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()
.
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;
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.