This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:2015:photoshop [2015/11/25 22:25] pkleczek [Idea projektu] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Projekt - Fotoszop ====== | ||
- | |||
- | [size=10]Nazwałem ten projekt "Fotoszop" oczywiście ze względu na prawną ochronę nazwy handlowej programu Photoshop firmy Adobe...[/size] | ||
- | |||
- | ===== 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 zaimplementujesz((zobacz znaczenie w [[http://sjp.pwn.pl/poradnia/haslo/implementowac;9044.html|SJP PWN]])) fragmenty kodu służące do wczytywania/zapisu danych obrazu oraz do operowania na pikselach. Umożliwi Ci to wykonywanie takch operacji jak: [[dydaktyka:cprog:2015:photoshop:exercises:filtering|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 | ||
- | * tworzenie kodu elastycznego i łatwego w zarządzaniu | ||
- | * ... | ||
- | |||
- | Projekt będzie tworzony zgodnie z regułą [[https://pl.wikipedia.org/wiki/KISS_%28regu%C5%82a%29|KISS]], stąd: | ||
- | * program będzie obsługiwał tylko obrazy w odcieniach szarości w 8-bitowej [[https://pl.wikipedia.org/wiki/G%C5%82%C4%99bia_koloru|głębi koloru]], zapisane w formacie [[https://pl.wikipedia.org/wiki/Windows_Bitmap|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: \\ | ||
- | {{:dydaktyka:cprog:2015:grayscale.png?nolink|}} | ||
- | ===== Architektura programu ===== | ||
- | |||
- | ==== Biblioteka "bmplib" ==== | ||
- | |||
- | Program korzysta z osobnej biblioteki służącej do odczytu i zapisu danych z pliku bitmapy((Autorem oryginalnego kodu biblioteki jest Michael Sweet. Kod ten można znaleźć na stronie [[http://paulbourke.net/dataformats/bmp/]])). 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: | ||
- | <code c> | ||
- | #include "bitmap.h" | ||
- | </code> | ||
- | 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 | ||
- | <code c> | ||
- | typedef unsigned char byte; | ||
- | </code> | ||
- | |||
- | ===== Ć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: | ||
- | <code c> | ||
- | /* TODO: Uzupełnij mnie! */ | ||
- | </code> | ||
- | Fragmenty do uzupełnienia znajdują się jedynie w pliku ''.c'' danego ćwiczenia. | ||
- | |||
- | :!: <wrap hi>**Nie zmieniaj niczego w pozostałym kodzie programu!**</wrap> | ||
- | |||
- | Ć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. | ||
- | |||
- | ---- | ||
- | |||
- | - [[dydaktyka:cprog:2015:photoshop:exercises:filtering|Filtracja – Rozmycie obrazu]] | ||
- | - [[dydaktyka:cprog:2015:photoshop:exercises:data_un_packing|Umieszczanie bajtów obrazu w tablicy]] | ||
- | - [[dydaktyka:cprog:2015:photoshop:exercises:dynamic_image_allocation|Dynamiczna alokacja tablicy-obrazu]] | ||
- | |||
- | |||