Materiały do laboratorium znajdują się tutaj.
Po rozpakowaniu powinniśmy zobaczyć dwa katalogi drop i
japan, zwierające obrazy.
Podstawowym programem, który będziemy używać na zajęciach jest
program convert z biblioteki ImageMagick. Program ten służy
do konwertowania i zmiany właściwości obrazów. Potrafi także dodawać
elementy do obrazu, a nawet tworzyć obrazy od zera. Najłatwiej zobaczyć
jak go używać analizując przykłady.
Uwaga:: Zanim rozpoczniesz pracę, skopiuj zdjęcia do tymczasowego katalogu!
Wykonaj poniższe operacje i sprawdź efekty.
convert plik.gif plik.jpg
– konwertuje plik w formacie .gif na format
.jpg,convert plik1.jpg -resize 50% plik2.jpg
– zmniejsza obrazek dwukrotnie,convert plik1.jpg -resize 100 plik2.jpg
– zmniejsza obrazek, tak aby krótszy wymiar był równy 100 pikseli,convert plik1.jpg -resize 100x100 plik2.jpg
– zmniejsza obrazek tak, aby mieścił się w kwadracie o wymiarze 100 na
100 pikseli,convert plik1.jpg -resize 100x100\! plik2.jpg
– zmniejsza obrazek dokładnie do rozmiaru 100 na 100 pikseli,– stworzy obrazek magic.jpg, z naniesionym tekstem
“Magic” (znak \ na końcu linii oznacza, że ciąg dalszy
komendy nastąpi w kolejnej linii).
Napisz skrypt, który:
.jpg zawarte w tym samym
katalogu, w którym znajduje się skrypt..jpg zawarte w tym samym
katalogu, w którym znajduje się skrypt i umieści je w innym
katalogu..jpg na
.gif, dodając końcówkę (plik.jpg ->
plik.jpg.gif)..jpg na
.gif, zmieniając końcówkę (plik.jpg ->
plik.gif).-border 20x20) z
aktualną datą (komenda date).stat -c %y plik).convert *.jpg animacja.gif.Spróbuj napisać skrypty wykonujące następujące zadania:
EXIF. Informację tę można wyciągnąć za pomocą polecenia
identify -format "%[EXIF:*]" plik.jpg.
Może to być np. modelu aparatu, którym wykonano zdjęcie.JPG. Argument -append łączy
obrazy w pionie, a argument +append w
poziomie. Przykładowo, komenda convert 1.jpg 2.jpg 3.jpg +append 4.jpg
złączy poziomo trzy obrazki w jeden.drop w
jeden duży obraz. Obrazy powinny być połączone tak aby tworzyły
szachownicę 10 na 10 obrazów. Podpowiedź: połącz obrazki
drop-00*.jpg w poziomie, później drop-01*.jpg,
itd. Następnie wszystkie te podłużne obrazki połącz w całość w
pionie.Czasem napisanie skryptu może być żmudne. Dotyczy to zwłaszcza
sytuacji, w których skrypt musi być rozbudowany a jednocześnie zostanie
wykorzystany tylko raz. Przykładowo, poniższy skrypt generuje obrazek
złożony z trzech nakładających się obrazów: czarno-białego tła oraz
dwóch plików 1.jpg i 2.jpg.
#!/bin/bash
convert -size 90x60 canvas:white \
-size 90x30 gradient: -append -rotate 90 \
\( 1.jpg -resize 90x90\! -clone 0 -compose CopyOpacity \
+matte -composite -repage +60+0 \) \
\( 2.jpg -resize 90x90\! -clone 0 -compose CopyOpacity \
+matte -composite -repage +120+0 \) \
-compose Over -mosaic overlap_series.jpgPrzeanalizuj powyższy przykład i napisz skrypt, który stworzy obrazek ze wszystkich plików zawartych w określonym katalogu. W tym celu skrypt powinien:
tmp.sh zawierający komendę analogiczną
do powyższej, tylko dla większej liczby obrazów (użyj echo linia > tmp
dla pierwszej linii i echo kolejna linia
>> tmp dla każdej następnej),tmp.sh,Program convert może wczytać dane binarne interpretując
je jako obrazek. Przykładowo, może to być tablica zawierająca wartości
typu char. Napisz program obrazek.c
zawierający poniższy kod:
#include <stdio.h>
#include <stdlib.h>
int main() {
const int N = 100;
const int M = 100;
char* tab = (char*)malloc(N * M * sizeof(char));
for (int i = 0; i < N * M; ++i)
tab[i] = 255 * i / (N * M - 1);
fwrite(tab, sizeof(char), N * M, stdout);
free(tab);
}Następnie skompiluj go za pomocą komendy
i wykonaj
Mamy teraz plik binarny zawierający liczby typu char (1
bajt) od 0 do 255. Możemy dokonać jego konwersji na obrazek
JPG wpisując:
Uwaga: Zamiast typu char moglibyśmy użyć tablicy typu
float i liczb z przedziału \([0,
1]\). Wtedy jednak musielibyśmy skonwertować obrazek za pomocą
polecenia:
obrazek.c napisz program
filtr.c, który:
ptr to wskaźnik na tablicę, size to
rozmiar elementu tablicy, count to liczba elementów do
wczytania, a stream to wskaźnik do strumienia, na którym
wykonywana jest operacja (w naszym przypadku będzie to
stdin),
x znajdzie wartość, która
pozwoli na odwrócenie odpowiadającego jej koloru (zauważ, że dla liczb
typu char kolor czarny to 0, a kolor biały to 255),<..jpg.