background image

praktyka

Praca z grafiką z linii komend

50

czerwiec 2007

praktyka

Praca z grafiką z linii komend

51

www.lpmagazine.org

lin

ux

@

so

ftw

ar

e.

co

m

.p

l

Praca z grafiką 

z linii komend

W latach 70-tych ubiegłego wieku do gospodarstw domowych trafiły pierwsze komputery, które poza 
wyświetlaniem tekstu, posiadały możliwość kontrolowania pojedynczych pikseli ekranu, innymi słowy 
– wyświetlania grafiki. Wtedy też natychmiast pojawiły się pierwsze programy do rysowania i oglądania 
obrazków, a obróbka obrazków nierozłącznie zaczęła kojarzyć się z narzędziami i z graficznym 
interfejsem użytkownika (GUI). Skąd więc pomysł, aby wiele lat później tworzyć i opisywać narzędzia 
graficzne działające z linii komend?

Piotr Wolny

P

o narzędzia działające z linii komend można 
sięgać z różnych powodów.  Pierwszym i chy-
ba  najczęstszym  jest  możliwość  łatwego  po-
wtórzenia raz zaprojektowanej operacji dowol-

ną ilość razy. Jeśli na przykład chcemy umieścić na jed-
nym obrazku nasz podpis, najprościej będzie uruchomić 
Gimp-a, załadować obydwa obrazki i połączyć. Jeśli jed-
nak chcemy to zrobić w odniesieniu do kilkuset czy wię-
cej plików, Gimp czy podobne programy przestają być 
użyteczne – również dlatego, że posługiwanie się w nich 
skryptami  czy  makropoleceniami  wcale  nie  należy  do 
prostych. Najlepszym rozwiązaniem będzie wtedy linia 
komend.

Innym  przykładem  zastosowania  programów  dzia-

łających  z  linii  komend  są  niektóre  operacje  tak  proste, 
że  zwyczajnie  nie  warto  uruchamiać  żadnego  progra-
mu z GUI, aby je wykonać. Jeśli chcemy na przykład po-
łączyć dwa obrazki w jeden duży, w każdym programie 
z GUI będzie to od nas wymagało przynajmniej kilkuna-
stu kliknięć myszą, a czasem nawet liczenia rozmiarów. 
Z linii komend będzie to kilka literek oraz nazwy dwóch 
plików. Jeśli nabierzemy trochę wprawy, to wiele podob-

nych prostych operacji będzie nam łatwiej wykonać wła-
śnie w ten sposób niż w GUI.

Coraz rzadszą choć wciąż jeszcze spotykaną jest sy-

tuacja, w której jakąś operację na plikach graficznych da 
się wykonać wyłącznie z linii komend. Z reguły progra-
mów o jakichś specjalistycznych funkcjach (jak np. dcraw 
do importu zdjęć z aparatów cyfrowych w formacie RAW 
czy  enblend  do  poprawiania  wyglądu  panoram)  można 
używać za pośrednictwem GUI. Co jednak, gdy pracuje-
my zdalnie przez SSH i ściąganie plików do obróbki lo-
kalnej zajmowałoby wiele czasu? Wtedy oczywiście rów-
nież nieoceniona staje się wiedza o programach działają-
cych z linii komend.

Tym bardziej, że większość operacji, które można wy-

konać na plikach z grafiką rastrową, w analogiczny spo-
sób można przeprowadzić na coraz bardziej popularnych 
PDF-ach.

Zmiana rozmiarów zdjęć

Skalowanie to jedna z najczęściej wykonywanych opera-
cji na plikach graficznych – często potrzebna, gdy chce-
my  umieścić  zdjęcia  w  internecie  lub  przesłać  je  przez 

background image

praktyka

Praca z grafiką z linii komend

50

czerwiec 2007

praktyka

Praca z grafiką z linii komend

51

www.lpmagazine.org

e-mail. Można ją wykonać na wiele rozmai-
tych  sposobów,  dlatego  doskonale  nadaje 
się do zaprezentowania możliwości linii ko-
mend.

Najpopularniejszym programem, które-

go możemy użyć w tym celu jest convert z zes-
tawu  programów  ImageMagick.  Pakiet  Ima-
geMagick
 (poświęcę mu dalej najwięcej miej-
sca)  znajdziemy  w  każdej  dystrybucji.  Ma 
on  ogromne  możliwości,  których  oczywi-
ście w całości nie sposób opisać w jednym 
artykule,  na  szczęście  ma  on  również  bar-
dzo dobrą dokumentację, gdzie na przykła-
dach  pokazane  są  możliwości  wszystkich 
programów z pakietu (patrz ramka W sieci). 
W tym artykule przedstawię kilka najprost-
szych  przykładów  jego  zastosowania,  któ-
re – mam nadzieję – zachęcą do korzystania 
z  niego  nawet  użytkowników  nieobezna-
nych z linią komend.

Jak można zatem przeskalować obrazek 

z linii komend? Zakładając, że nasz plik na-
zywa  się  obraz.jpg  i  w  konsoli  przeszliśmy 
do katalogu, w którym on się znajduje (np. 
cd /home/piotr/obrazy), możemy wydać pole-
cenie:

convert obraz.jpg -
      resize 50% obraz-maly.jpg.

Tak  więc  najpierw  podajemy  nazwę  orygi-
nalnego obrazka, później opcje (może ich być 
więcej), na końcu zaś nazwę pliku wyniko-
wego. Zamiast podawania wartości w pro-
centach możemy określić szerokość w pikse-
lach pliku wynikowego – wysokość zostanie 
dostosowana proporcjonalnie:

convert obraz.jpg -
      resize 200 obraz-maly.jpg.

Analogicznie  –  możemy  podać  również  do-
celową wysokość obrazka (w miejsce -resize 
200
 wpisujemy -resize x100) albo też dodając 
wykrzyknik określić „na sztywno” pożąda-
ną wysokość i szerokość (-resize "200x100!"). 
Oczywiście  podawane  przez  nas  wartości 
mogą  służyć  zarówno  do  zmniejszania,  jak 
i powiększania obrazków.

Program  convert,  poza  -resize  posiada 

jeszcze dwie inne opcje, które robią prawie 
to samo, a ich składnia jest identyczna. Jeśli 
zastąpimy -resize poprzez -scale, to użyty zo-
stanie inny, znacznie szybszy algorytm ska-
lowania. Jeśli zaś użyjemy -thumbnail, zosta-
nie użyty ten sam algorytm co przy -resize
jednak dodatkowo zostaną usunięte wszyst-
kie  dodatkowe  dane  (komentarze,  exif  itp.) 
niepotrzebne przy miniaturkach.

Program convert i ImageMagick to zdecy-

dowanie najpopularniejszy wybór użytkow-
ników Linuksa, jednak istnieją w stosunku 
do niego alternatywy. Jedną z nich jest fork 
z  projektu  ImageMagick  o  nazwie  Graphics
Magick  
(http://www.graphicsmagick.org/).  Pa-
kiet  o  tej  nazwie  znajdziemy  w  Debianie 
oraz Ubuntu #########. Jeśli nasza dystry-
bucja go nie zawiera, możemy posłużyć się 
gotowym pakietem rpm dostępnym na stro-
nie projektu.  GraphicsMagick odłączył się od 
ImageMagick,  aby  zapewnić  bardziej  stabil-
ne  API  dla  programistów.  Rzadziej  wpro-
wadzane są więc do niego nowe funkcje, za 
to jednak często okazuje się, że GraphicsMa-
gick
 działa szybciej.

Składnia poleceń jest prawie identyczna 

jak w przypadku ImageMagick – najważniej-
szą różnicą jest to, że każde polecenie poprze-
dzamy komendą 

gm

. Jeśli więc wpiszemy:

convert test.jpg
      -resize 50% thumb.png,

uruchomimy  program  z  pakietu  ImageMa-
gick
. Wpisując zaś:

gm convert test.jpg
      -resize 50% thumb.png,

użyjemy GraphicsMagick. Dopisując dodatko-
wo z przodu polecenie time, możemy zmie-
rzyć  różnicę  szybkości  działania  w  naszych 
zastosowaniach.

Inną  alternatywą  dla  ImageMagick  jest 

biblioteka  i  programy  ExactImage  (http://
www.exactcode.de/oss/exact-image/
).  Są  one 
dziś  na  dość  wczesnym  etapie  rozwoju 
i właściwie nie wiadomo, jak będzie wyglą-

dać ich przyszłość, bowiem są one rozwija-
ne bardziej przez prywatną firmę niż przez 
społeczność  open  source.  Dziś  jednak  obję-
te są licencją GPL i można bez większych 
problemów  skompilować  je  samodzielnie. 
Wystarczy po ściągnięciu źródeł ze strony 
domowej  (w  momencie  pisania  tego  arty-
kułu  najnowszy  był  plik  exact-image-0.3.4.
tar.bz2
) rozpakować je i wydać tradycyjne
polecenia:

./configure; make; make install.

Pomimo ogromu warnings programy powin-
ny się skompilować.

W  efekcie  otrzymujemy  m.in.  program 

econvert.  Choć  ma  on  mniejsze  możliwości 
niż  opisywany  wcześniej  convert,  używa  się 
go  bardzo  podobnie.  Najistotniejszą  różnicą 
jest konieczność podania opcji -i przed nazwą 
pliku źródłowego oraz -o przed nazwą pliku 
wynikowego, np:

econvert -i obraz.jpg
      --scale 50% -o maly-obraz.jpg.

Bez  żadnych  dodatkowych  opcji  prędkość 
działania jest podobna jak w przypadku co-
nvert
,  jednak  jakość  pliku  wynikowego  jest 
zauważalnie lepsza. Za to zamieniając --scale
na --nearest-scale, przyspieszymy program pra-
wie trzykrotnie.

Operacje na wielu plikach

Znamy już różne proste metody skalowania 
obrazów. Jak jednak wykonać je szybko i wy-
godnie na wielu plikach? Oczywiście w takim 
przypadku wpisywanie wiele razy podobnej 
komendy nie ma sensu. Moim zdaniem naj-
lepiej wtedy zapoznać się z programem find
Jest to bardzo uniwersalne narzędzie do od-
najdywania plików i katalogów na podstawie 
dowolnych kryteriów. My skorzystamy teraz 
z jego opcji -exec, która umożliwia wykonanie 
dowolnego polecenia z nazwą znalezionego 
pliku jako argumentu. Tak więc find będzie-
my mogli stosować z dowolnym z wcześniej 
opisanych programów.

Najszybciej  jest  wytłumaczyć  działanie 

czegoś na przykładzie, zobaczmy więc nastę-
pujące polecenie:

find .  -maxdepth 1  -name '*.jpg
      ' -exec convert '{}
            ' -thumbnail"x100"
                  miniatury/'{}' ';'

Pierwszy argument określa, w jakim katalo-
gu szukamy plików (pojedyncza kropka ozna-

Listing 1. 

Przykład z dokumentacji ImageMagick

convert obraz.jpg  \
-font /usr/share/fonts/truetype/antpb.ttf -pointsize 20 \
-draw 

"gravity south \

fill black  text 0,12 'Nasz podpis' \
 fill white  text 1,11 'Nasz podpis' "

 \

obraz-podpisany.jpg

background image

52

czerwiec 2007

praktyka

Praca z grafiką z linii komend

53

www.lpmagazine.org

praktyka

Praca z grafiką z linii komend

cza katalog bieżący), następny argument po-
wstrzymuje program przed schodzeniem do 
podkatalogów,  po  parametrze  -name  okre-
ślamy  pliki,  do  których  ma  zostać  zastoso-
wana nasza operacja – w tym przypadku na 
podstawie  ich  rozszerzenia.  Następnie  po-
między  -exec  oraz  znakami  ";"    wpisujemy 
komendę, która będzie wykonywana. Śred-
nik  na  końcu  jest  niezbędny,  aby  powło-
ka wiedziała, w którym miejscu kończy się 
nasza  komenda.  Musimy  go  jednak  podać 
w  cudzysłowach,  najlepiej  pojedynczych. 
Znaki  {}  zastępowane  są  nazwą  każdego 
z plików znalezionych przez find. One rów-
nież powinny znaleźć się w cudzysłowach, 
zwłaszcza jeśli w nazwach naszych plików 
są spacje. W efekcie więc nasza komenda bę-
dzie uruchomiona tak wiele razy, ile plików 
zostanie  odnalezionych  przez  find.  W  tym 
przypadku  wygenerowane  miniatury  znaj-
dą  się  w  podkatalogu  miniatury,  możemy 
jednak  nadpisać  pliki  wyjściowe,  podając 
dwukrotnie samo {}.

Więcej informacji na temat działania pro-

gramu find można znaleźć w jego podręczni-
ku (

man  find

). Jeszcze bardziej zaawansowa-

ne możliwości dostaniemy używając progra-
mu 

xarg

 (

man xarg

), ich opis jednak nie mie-

ści się już w tematyce artykułu.

Stosowanie  find  jest  najbardziej  uni-

wersalną metodą, czasem jednak można się 
bez niej obejść i wykonać operację na wielu 
plikach  znacznie  prościej.  Jeśli  wystarczą 
nam możliwości, jakie oferuje ImageMagic, 
w takich przypadkach zamiast convert mo-
żemy użyć programu mogrify. Jego główną 
różnicą w stosunku do convert jest to, że do-
myślnie zmienia on plik wejściowy zamiast 
tworzyć  nowy.  Tak  więc,  o  ile  w  convert 
musieliśmy podać plik wejściowy i wyjścio-
wy, to w mogrify podajemy wyłącznie plik 
wejściowy  oraz  oczywiście  opcje.  Dodat-
kowo zamiast pełnej nazwy pliku możemy 
podać wzorzec, np. '*.jpg'. Tak więc polece-
nie:

mogrify   -thumbnail 200 '*.jpg'

zamieni wszystkie pliki *.jpg w katalogu bie-
żącym na miniatury o szerokości 200 punk-
tów. Możemy jednak uniknąć usunięcia pli-
ków  wejściowych,  dodając  np.  opcję  -format 
png
. Na przykład poleceniem:

mogrify -format png
      -thumbnail 200 '*.jpg'

utworzymy miniaturki w formacie png, po-
zostawiając pliki wejściowe bez zmian.

Inne operacje graficzne

Wiemy  już,  jak  wykonać  jedną  z  najprost-
szych operacji, czyli zmianę rozmiaru obraz-
ków, a także, w jaki sposób powtórzyć ją na 
dowolnie wielkim zbiorze plików.

Programy z pakietu ImageMagick umożli-

wiają wykonanie w analogiczny sposób wie-
lu znacznie bardziej zaawansowanych opera-
cji na plikach. Oczywiście nie sposób opisać 
tutaj ich wszystkich, wspomnę jedynie takie, 
które  wydają  się  najciekawsze  albo  najbar-
dziej potrzebne.

Większość ludzi uważa, że zdjęcia ładniej 

wyglądają w ramkach. Z linii komend może-
my  łatwo  tworzyć  rozmaite  obramowania, 
począwszy od najprostszych, np:

convert obraz.png
      -bordercolor "rgb(1,255,100)"
      -border 25x5 obraz-ramka.png.

Parametry – jak łatwo się domyślić – określa-
ją kolor ramki oraz jej rozmiar. Nieco ciekaw-
szy efekt uzyskamy stosując opcję -raise albo 
+raise – wtedy brzegi obrazka będą przyciem-
nione lub rozjaśnione, tworząc złudzenie głę-
bi. Na przykład:

convert obraz.jpg
      +raise 40x40 obraz-ramka.png.

Oczywiście szerokość ramki dobieramy tak, 
aby wynosiła co najmniej 1% wielkości obraz-
ka. Jeśli mamy convert w wersji przynajmniej 
6.3.2 (

convert -version

), możemy wykonać 

jeszcze  ciekawsze  obramowanie  „udające” 
zdjęcie  z  aparatu  Polaroid.  Najlepiej  nadaje 
się ono dla miniaturek fotografii. Przykłado-
we polecenie może wyglądać tak:

convert obraz.jpg
   -thumbnail 200
      -background gray40
         +polaroid obraz-mini.png.

Kolejną  metodą  tworzenia  ramek,  tym  ra-
zem wyglądających nieco trójwymiarowo, jest 
opcja  -frame,  która  przejmuje  cztery  parame-
try:  szerokość,  wysokość  oraz  szerokość  we-
wnętrznego  i  zewnętrznego  skosu.  Na  przy-
kład:

convert obraz.jpg
   -frame 40x40+40+10
      obraz-ramka.png.

Proponuję  poeksperymentować,  dodając 
do  tej  komendy  dodatkowe  opcje  -border-
color
 oraz -mattecolor z wartością rgb poda-
ną  za  pomocą  trzech  liczb,  jak  w  przykła-
dzie wcześniejszym. Ciekawe efekty można 
uzyskać  również  podając  opcję  -frame  wie-
lokrotnie.  Oczywiście,  gdy  już  wypracuje-
my sobie ładną ramkę, możemy powtórzyć 
operację  jej  tworzenia  dla  wszystkich  pli-
ków przy pomocy find.

Umieszczając zdjęcia w internecie, bar-

dzo  często  je  podpisujemy.  Choć  istnieją 
programy z GUI, które potrafią to wykonać 
szybko dla wielu zdjęć, jeśli użyjemy narzę-
dzi z pakietu ImageMagick, otrzymamy bar-
dzo  szerokie  możliwości  często  dostępne 
gdzie indziej.

Przykładowe  komendy  robią  się  jed-

nak  dosyć  długie,  dlatego  dla  zwiększenia 
czytelności podaję je w kilku liniach, z któ-
rych każda – za wyjątkiem ostatniej – koń-
czy się odwrotnym ukośnikiem „\”. Wpisu-
jąc te komendy w konsoli, możemy robić to 
w wielu liniach ze znakiem „\”, tak jak po-
niżej  albo  w  jednej  linii,  pomijając  wtedy 
znak „\”.

Poniższy  przykład  zaczerpnięty  z  nie-

wielkimi  zmianami  z  dokumentacji  Image-
Magick
  umieści  na  naszym  obrazku  biały 
tekst z czarną obwódką, dzięki czemu będzie 
on  zawsze  widoczny  niezależnie  od  kolo-
rystyki.

W  powyższym  przykładzie  obraz.jpg 

oraz obraz-podpisany.jpg to oczywiście pliki 
wejściowy  i  wyjściowy.  Czcionka  (której 
wielkość w punktach określa następny para-
metr)  została  podana  w  postaci  bezwzglę-
dnej ścieżki do pliku truetype – nie musi być 
ona  zainstalowana,  a  w  każdym  systemie 
może  znajdować  się  gdzie  indziej.  W  ko-
lejnym  parametrze  określiliśmy  położenie 
napisu jako południowe (south), czyli u dołu 
na  środku.  Alternatywnie  możemy  podać 
NorthWest,  North,  NorthEast,  West,  Center, 
East,  SouthWest,  SouthEast
.  Podpis  podaje-
my dwukrotnie taki sam, bowiem najpierw 
będzie on napisany na czarno, a później na 

Listing 2. 

Przykładowe polecenia

jhead -model
      

"FinePix S9500"

 -nffuji-%Y_%m_%d-%H_%M_%S *.jpg

jhead -model
      

"Canon PowerShot A60"

 -nfcanon-%Y_%m_%d-%H_%M_%S *.jpg

background image

54

czerwiec 2007

praktyka

Praca z grafiką z linii komend

55

www.lpmagazine.org

praktyka

Praca z grafiką z linii komend

biało.  Listę  nazw  kolorów  w  ImageMagick 
można uzyskać poleceniem:

convert -list Color

Dokumentacja ImageMagick zawiera ogrom-
ną  ilość  bardzo  zaawansowanych  sposo-
bów  użycia  opcji  rysowania  i  oznaczania 
tekstem. Pisząc znacznie dłuższe polecenia, 
możemy uzyskać dużo ładniej wyglądające 
napisy. Jeśli jednak zależy nam na ładnym 
oznaczeniu  obrazków,  często  lepszym  wy-
borem  może  być  przygotowanie  osobnego 
pliku graficznego zawierającego tekst z na-
szym  podpisem  lub  nasze  logo.  Następnie 
możemy  łatwym  poleceniem  nałożyć  ten 
plik na obrazek, tworząc coś w rodzaju pi-
sma  wodnego.  Najlepsze  efekty  uzyskamy 
oczywiście wtedy, gdy plik z naszym zna-
kiem zawiera przezroczystość zamiast zwy-
kłego tła.

Zakładając, że mamy plik znak.png i chce-

my  nałożyć  go  na  obraz.jpg  uzyskując  ob-
raz-zaznaczony.jpg,
 polecenie może wyglądać 
następująco:

composite -watermark 30%
   -gravity north  znak.png
      obraz2.jpg  obraz-znaczony.jpg.

Podane  30%  to  oczywiście  stopień  „odci-
śnięcia” naszego znaku. Gdy chcemy, aby 
nasza  praca  została  zabezpieczona  przed 
kadrowaniem,  możemy  użyć  samego  -tile 
zamiast -gravity north. Nastąpi wtedy wy-
pełnienie znakiem całego obrazu. Zamiast 
-watermark  możemy  też  wypróbować  -dis-
solve.

Zarządzamy zbiorem zdjęć

Gdy posiadamy aparat cyfrowy, nasz dysk 
w mniejszym czy większym tempie wypeł-
nia  się  plikami  jpg.  Korzystając  z  linii  ko-
mend  możemy  podjąć  różne  zabiegi,  aby 
utrzymać w naszym zbiorze porządek.

Pierwszym  problemem,  jaki  może  się 

pojawić  w  dużym  zbiorze  zdjęć  są  poja-
wiające  się  duplikaty,  czyli  te  same  zdję-
cia ściągnięte z aparatu wielokrotnie i znaj-
dujące się najczęściej w różnych katalogach 
pod  innymi  nazwami.  Programem,  który 
bardzo  szybko  potrafi  odnaleźć  takie  pli-
ki nawet w ogromnym zbiorze jest fdupes
Program ten oblicza sumy md5 wszystkich 
badanych  plików,  w  istocie  więc  ma  ma-
ło  wspólnego  z  grafiką  komputerową  po-
za faktem, że często przydaje się przy pli-
kach graficznych. Najczęstszy sposób jego 
użycia to:

fdupes -r /home/user/
      katalog-z-obrazkami.

Opcja -r spowoduje przechodzenie do pod-
katalogów. Jeśli dodamy opcję -d, program 
będzie pytał, który z duplikatów zachować, 
usuwając wszystkie pozostałe. Alternatyw-
nie  możemy  wywołać  program  z  opcją  -f 
i przekierować jego wyjście do jakiegoś pli-
ku, np:

fdupes -r -f katalog >/tmp/lista.

W tym przypadku w pliku 

/tmp/lista

 bę-

dzie lista plików, które można bezpiecznie 
usunąć. Można napisać skrypt, który z niej 
skorzysta  albo  też  korzystając  z  funkcji 
znajdź i zamień w dowolnym edytorze tek-
stu dopisać tam przed każdą nazwą pliku 
komendę  rm  i  uruchomić  ten  plik  polece-
niem:

sh /tmp/lista

Program  fdupes  działa  bardzo  szybko,  ale 
znajdzie tylko i wyłącznie pliki identyczne. 
Na  zupełnie  innej  zasadzie  działa  findima-
gedupes
,  który  analizuje  wygląd  obrazków, 
w ten sposób znajdując pliki identyczne lub 
całkiem podobne. Jeśli więc ten sam obraz 
nagramy w różnych formatach, zostanie on 
potraktowany jako duplikat. Z drugiej stro-
ny findimagedupes wymaga bardzo dużo cza-
su i pamięci, zwłaszcza na większych zbio-
rach  plików.  Zamiast  z  linii  komend  moż-
na  go  wywołać  również  z  GUI  programu 
Gqview,  jednak  mi  osobiście  wcale  nie  wy-
dało się to wygodniejsze.

Po znalezieniu duplikatów możemy za-

stanowić się nad zmianą formatu przecho-
wywanych  zdjęć.  Konwersja  między  róż-
nymi formatami przy pomocy programów 
z pakietu ImageMagick jest banalnie prostą 
operacją. Na przykład polecenie:

mogrify -format jpg
      -quality 90 '*.tif'

zamieni wszystkie TIFF-y w bieżącym kata-
logu na pliki JPEG z jakością kompresji 90 
(domyślna jakość w ImageMagick to 75). Kon-
wersji  można  dokonywać  też  przy  pomo-
cy programu convert – wystarczy w nazwie 
pliku  docelowego  podać  pożądane  roz-
szerzenie –  ImageMagick obsługuje ponad 
100 różnych formatów. Najprostszy przyk-
ład:

convert plik.jpg plik.tif.

Ponadto  przy  pomocy  opcji  -quality  z  pro-
gramami  mogrify  lub  convert  możemy  szyb-
ko zmienić stopień kompresji JPEG naszych 
plików, np:

mogrify   -quality 50  '*.jpg'

lub:

find . -name '*.jpg'
      -exec convert
         -quality 50 {} {} \;.

Jeśli  jesteśmy  przy  tematyce  konwersji 
i rozmiarów zdjęć, nie można pominąć bar-
dzo  ciekawego  narzędzia  o  nazwie  jhead
Przy  jego  pomocy  możliwe  są  operacje  na 
nagłówku EXIF (tworzonym przez cyfrowe 
aparaty fotograficzne) oraz innych dodatko-
wych  danych  w  plikach  JPEG.  Pierwszym 
zastosowaniem, jakie może się przydać jest 
usunięcie  z  plików  wszystkich  dodatko-
wych  danych  przy  pozostawieniu  same-
go obrazu. Można to wykonać dla wszyst-
kich obrazków w bieżącym katalogu pole-
ceniem 

jhead -purejpg *.jpg

. W ten spo-

sób nie tylko zaoszczędzimy po nawet 10kb 
na  każdym  zdjęciu,  ale  przede  wszystkim 
usuniemy dane, które możemy uznawać za 
prywatne, czyli np. posiadany model apa-
ratu,  data  wykonania  zdjęcia,  parametry 
ekspozycji itp.

To  oczywiście  nie  jedyne  zastosowanie 

programu jhead. Doskonale potrafi on bowiem 
zmienić nazwy plików, korzystając z zapisa-
nej w nagłówku EXIF daty wykonania zdję-
cia. Na przykład polecenie:

jhead -nfzdjecie-%Y_%m_%d
      -%H_%M_%S *.jpg

uporządkuje nasze fotografie według daty. 
Jeśli  plik  nie  będzie  miał  nagłówka  EXIF, 
zostanie użyta data z systemu plików. Uży-
wając dodatkowo opcji -model, możemy po-
segregować  zdjęcia  na  podstawie  apara-
tów,  którymi  zostały  wykonane.  Na  przy-
kład najpierw przy pomocy np. 

head *.jpg

 

sprawdzamy,  jakie  różne  wartości  wystę-
pują  u  nas  w  polu  Camera  model.  Następ-
nie, korzystając z nich, wprowadzamy róż-
ne nazwy plików. Przykładowo przy posia-
danych przeze mnie aparatach były to pole-
cenia (Listing 2).

Warto wiedzieć, że nagłówek EXIF, który 

jest najczęściej usuwany podczas edycji pli-
ku w programach graficznych można przy-
wrócić,  korzystając  również  z  jhead.  Oczy-
wiście pod warunkiem, że posiadamy ory-

background image

54

czerwiec 2007

praktyka

Praca z grafiką z linii komend

55

www.lpmagazine.org

praktyka

Praca z grafiką z linii komend

ginalny  plik  z  nieuszkodzonymi  danymi. 
Następujące  polecenie  skopiuje  nagłówek 
z pliku oryginalny.jpg na zmodyfikowany.jpg:

jhead -te oryginalny.jpg
      zmodyfikowany.jpg.

Oczywiście w ten sposób możemy „udawać”,
że zdjęcie zostało wykonane na innym sprzę-
cie lub w innych warunkach niż w rzeczy-
wistości.  Dodatkowo  w  podręczniku  pro-
gramu 

man  jhead

 można znaleźć opis wy-

konania  tego  polecenia  na  wielu  plikach 
jednocześnie.

Inne operacje z linii komend

Jakie inne operacje warto umieć wykonać z li-
nii komend? Cóż, moim zdaniem ich lista jest 
dosyć  długa.  Przede  wszystkim  nie  wspo-
mniałem  jeszcze  o  programie  identify,  który 
drukuje na konsoli informacje o pliku graficz-
nym. Wystarczy wpisać:

identify [nazwa_pliku]

lub:

identify -verbose [nazwa_pliku].

W tym drugim przypadku poza typem, roz-
dzielczością  i  rozmiarem  zobaczymy  tak-
że wiele zaawansowanych danych, np. sto-
pień kompresji czy statystyki dotyczące ko-
lorów.

Znając  rozmiar  obrazka,  możemy  po-

dzielić go na kilka mniejszych przy pomocy 
opcji -crop programu convert. Na przykła:

convert obraz.jpg
   -crop 200x200+500+600
      kawalek.jpg

stworzy  plik  kawalek.jpg  o  rozmiarach  200x
200 zawierający fragment obraz.jpg od piksela 
o położeniu x=500 i y=600. Częściej niż dzie-
lenie obrazków przydaje się ich łączenie. Je-
śli obrazki mają być łączone poziomo od le-
wej  do  prawej,  posługujemy  się  opcją  -ap-
pend
, np:

convert 1.png 2.png 3.png
      +append rzad1.miff.

Następnie przy łączeniu obrazków w pionie 
używamy -append, np:

convert rzad1.miff rzad2.miff
      -append calosc.tif.

Należy  zwrócić  uwagę  na  użyty  tutaj  for-
mat  dla  „tymczasowych”  plików,  miano-
wicie MIFF (The Magick Image File Format). 
Jest to wewnętrzny format programów Ima-
geMagick
  i  zapisywanie  do  niego  jest  sto-
sunkowo  najszybsze.  Dla  plików  tymcza-
sowych możemy też używać innych forma-
tów bezstratnych, np. BMP czy TIFF. Nigdy 
nie należy za to używać JPEG czy GIF, gdyż 
wiązać  się  to  będzie  ze  stratą  czasu  i  ja-
kości.

Ostatnią  operacją  na  plikach  graficz-

nych,  o  której  chciałbym  wspomnieć  jest
stworzenie filmu w formacie AVI ze wszyst-
kich zdjęć z danego katalogu. Przy użyciu
mencoder'a  taki  film  z  pokazem  slajdów 
utworzymy bardzo szybko nawet przy wie-
lu  zdjęciach.  Przykładowe  polecenie  przy 
rozmiarze  docelowym  640x480  i  zmianie 
klatki  co  pół  sekundy  może  wyglądać  na-
stępująco:

mencoder "mf://*.jpg" -mf fps=
      0.5 -vf scale=640:480
            -o wyjscie.avi -ovc lavc
               -lavcopts vcodec=mpeg4.

Tak utworzony plik bez problemu obejrzy-
my  na  komputerze.  Jeśli  jednak  chcemy 
stworzyć pokaz MPEG, by zapisać go na pły-
cie DVD-Video, aby móc go obejrzeć w do-
wolnym  sprzętowym  odtwarzaczu  DVD, 
powinniśmy posłużyć się GUI programu Di-
giKam, gdzie wybieramy Narzędzia->Utwórz 
pokaz slajdów MPEG
.

Przetwarzanie plików PDF

Pliki  PDF  (ang.  Portable  Document  Format) 
systematycznie  zdobywają  coraz  większą 
popularność  jako  stosunkowo  niewielkie 
i  łatwe  w  tworzeniu,  a  także  niezawodne 
–  w  przeciwieństwie  do  wielu  innych  for-
matów  zapisu  danych  praktycznie  zawsze 
wyglądają  tak  samo  na  różnych  kompute-
rach i systemach operacyjnych. Choć Linux 
nie jest dobrze wspierany przez firmę, któ-
ra stworzyła ten standard, w naszym syste-
mie  mamy  niezłe  narzędzia  do  tworzenia 
i  modyfikacji  plików  PDF.  W  tym  artyku-
le wspomnę o tych, których używam z linii 
komend.

Na początek lista programów, które bę-

dą nam potrzebne. Zapewne mamy już za-
instalowany  pakiet  z  ImageMagick,  podob-
nie zresztą jak Ghostscript (pakiet o tej samej 
nazwie, ewentualnie gs-gpl lub gs-esp). Przy-
dadzą  nam  się  również  pakiety  xpdf-utils 
lub poppler-utils oraz pdftk, czyli PDF Toolkit
Do szybkiej konwersji obrazków na format 

PDF bardzo polecam program Sam2p (http:
//www.inf.bme.hu/~pts/sam2p/
) – on jako je-
dyny nie trafił jeszcze do wszystkich dys-
trybucji (choć jest przynajmniej w Debianie 
i Ubuntu). Można jednak łatwo zainstalo-
wać  go  nawet  ze  źródeł  –  po  ściągnięciu 
pliku  sam2p-latest.tar.gz,  rozpakowaniu 
i  przejściu  do  nowo  utworzonego  katalo-
gu (u mnie sam2p-0.45) wystarczą polece-
nia:

./configure –enable-lzw
      --enable-gif; make;
            make install.

Czynnością,  którą  najczęściej  zdarza  mi  się 
wykonywać  z  linii  komend  jest  tworzenie 
pliku  PDF  z  wielu  obrazków  w  JPEG  lub 
TIFF. Mogą to być skany jakiegoś dokumen-
tu  albo  nawet  zwykłe  zdjęcia  –  konwersja 
do  PDF  jest  niezłą  metodą  na  wygodne 
przesłanie  ich  do  podglądu  przez  e-mail
tym  bardziej,  że  dostajemy  łatwą  kontrolę 
nad rozmiarem pliku wynikowego.

Jak można utworzyć plik z jednym ob-

razkiem  na  stronę?  Musimy  rozpocząć  od 
konwersji  każdego  obrazka  do  osobnego 
pliku PDF. Można to wykonać przy pomo-
cy omawianego już wcześniej programu co-
nvert
, na przykład wpisując

convert -page a5 foto.jpg strona1.pdf

Funkcja  -page  jest  oczywiście  opcjonalna, 
a  dodatkowo  możemy  użyć  też  omawia-
nych  wcześniej  -scale  i  -quality,  dzięki  cze-
mu  będziemy  mieli  kontrolę  nad  rozmia-
rem tworzonego pliku PDF.

Zamiast  convert  do  tworzenia  PDF-ów 

z obrazków możemy użyć programu sam2p.
Ma on co prawda zdecydowanie mniej op-
cji, jednak swoje zadanie wykonuje dosko-
nale, tworząc często mniejsze pliki i działa-
jąc wielokrotnie szybciej. Przykładowe je-
go użycie może wyglądać w ten sposób:

sam2p -c ijg:50 foto.jpg strona.pdf

Przy pomocy opcji -c ijg:50  ustawiamy jakość 
kompresji JPEG (w przedziale od 1 do 100). 
Program ten nie potrafi skalować plików, jed-
nakże  sterowanie  poziomem  kompresji  do-
skonale  sprawdza  się  w  osiąganiu  pożąda-
nych rozmiarów plików PDF.

Aby szybko skonwertować wszystkie ob-

razki do plików PDF, możemy użyć progra-
mu find, podobnie jak w opisywanym wcze-
śniej punkcie „Operacje na wielu plikach”, na 
przykład:

background image

56

czerwiec 2007

praktyka

Praca z grafiką z linii komend

57

www.lpmagazine.org

praktyka

Praca z grafiką z linii komend

find . -name '*.jpg' 
      -exec sam2p
      -c ijg:50 {} {}.pdf  ';'

Za to do operacji złączenia powstałych stron 
PDF w jeden dokument użyjemy programu 
pdftk:

pdftk *.pdf cat output 
   calosc.pdf.

Na jego stronie domowej można znaleźć wię-
cej  przykładów  wykonania  tej  operacji  na 
różne sposoby.

Gdy mamy już gotowy plik PDF, może-

my zapoznać się z narzędziami, które po-
trafią go podzielić, konwertować czy zmo-
dyfikować.  Na  początek  jednak  powinni-
śmy  poznać  dokładnie  nasz  materiał,  naj-
lepiej  przy  pomocy  programu  pdfinfo.  Po 
wydaniu komendy pdfinfo [nazwa_pliku_
pdf] dowiemy się m.in.  jaki program stwo-
rzył ten dokument, poznamy datę utworze-
nia, liczbę stron czy rozmiar papieru. Naj-
ważniejszą  informacją  będzie  jednak  wer-
sja  standardu  PDF  (PDF  version).  Jeśli  jest 
to 1.6 lub 1.7, to niestety możemy spodzie-
wać się pewnych problemów z działaniem 
niektórych  narzędzi  linuksowych.  Starsze 
wersje standardu powinny działać bez pro-
blemów.

Chcąc stworzyć plik PDF, który jest bar-

dziej „pewny” zarówno w obróbce jak i przy
oglądaniu na różnych komputerach, może-
my wygenerować go na nowo przy pomocy 
programu ps2pdf. Wpisując np:

ps2pdf12 stary.pdf nowy.pdf

uzyskamy plik w nowy.pdf z tą samą zawar-
tością jednak stworzony przez dosyć „pew-
ne” narzędzie, a dodatkowo będący w jednej 

z najstarszych wersji standardu PDF, czyli 1.2 
(które  odpowiada  wersji  3.0  oprogramowa-
nia Adobe Acrobat). Analogicznie – przy pomocy

ps2pdf13

  i 

psd2pdf14

  możemy  tworzyć  pliki

w nieco nowszej wersji standardu.

Pliki  PDF  można  łatwo  rozdzielić  na 

poszczególne strony przy pomocy komen-
dy np:

pdftk plik.pdf burst
      output strona-%02d.pdf.

Wszystkie parametry po burst są opcjonalne 
– program użyje wtedy domyślnych nazw 
stron w postaci pg_#####.pdf. Zamiast wy-
dzielać  wszystkie  strony  do  osobnych  pli-
ków możemy część dokumentu, np. strony 
2-5, umieścić w osobnym pliku:

pdftk plik.pdf cat 2-4
      output strony2-5.pdf.

Pliki  PDF  łączymy  jeszcze  prościej  polece-
niem:

pdftk 1.pdf 2.pdf 3.pdf
      cat output 123.pdf.

Jedną  z  ciekawszych  możliwości  pdftk 
jest umieszczanie „znaku wodnego” w tle 
wszystkich  stron  dowolnego  pliku  PDF. 
Nasz „znak wodny” będzie doskonale wi-
doczny pod tekstem albo pod innymi czę-
ściowo  przezroczystymi  obiektami.  Jeśli 
jednak  w  pliku  PDF  występuje  jakiś  nie-
przezroczysty obiekt (np. zdjęcie), to ono 
przykryje nasz dodatkowy znak. Zabawę 
musimy  rozpocząć  od  stworzenia  jednej 
strony PDF zawierającej nasz „znak wod-
ny” – najczęściej jakiś jasnoszary rysunek
lub  tekst.  Oczywiście  możemy  to  zrobić 
z linii komend, wygodniej chyba jednak bę-
dzie w OpenOffice, skąd można wyekspor-
tować szybko gotowy PDF. Jeśli nasz „znak 
wodny” znajduje się w pliku znak.pdf, a plik,
który chcemy oznaczyć to nasz.pdf, to wpi-
sujemy następującą komendę:

pdftk nasz.pdf 
background znak.pdf
output gotowy.pdf

Na  zakończenie  omawiania  plików  PDF 
warto wspomnieć jeszcze o programie pdf-
tohtml
 (część pakietu poppler-utils) – przy 
jego pomocy można zapoznać się z teksto-
wą zawartością pliku PDF przy pomocy do-
wolnej przeglądarki – w tym również dzia-
łających  z  linii  komend 

lynx

  czy 

w3m

.  Do 

konwersji  w  drugą  stronę  można  użyć 
programu  html2ps  –  wynik  jego  działania 
można przekonwertować z Postscriptu przy
użyciu  ps2pdf.  Ciekawsze  możliwości  ma 
jednak  program  e2ps,  którego  można  uży-
wać np. w ten sposób:

cat /etc/apache/httpd.conf
      | a2ps | ps2pdf14
            - moj_apacz.pdf

W  wyniku  otrzymamy  zaskakująco  ładnie 
sformatowany dokument.

Zakończenie

Programy działające z linii komend mogą do-
skonale  przydać  się  nie  tyko  programistom 
czy  inżynierom  oprogramowania,  ale  rów-
nież  zwykłym  użytkownikom,  którzy  chcą 
na przykład zrobić ciekawe rzeczy ze swoimi 
zdjęciami z wakacji.

Opisane tutaj możliwości w zakresie ob-

róbki grafiki z linii komend to w istocie tyl-
ko mała namiastka tego, co da się zrobić, ko-
rzystając  z  darmowych  linuksowych  narzę-
dzi. Dużo więcej interesujących przykładów 
i  bardziej  zaawansowane  opisy  można  zna-
leźć  przede  wszystkim  na  stronach  projek-
tu ImageMagick, gdzie zapraszam wszystkich 
zainteresowanych.

Gdy dużo zajmujemy się grafiką pod Linuk-

sem, na pewno mamy sporo plików XCF. Na-
wet jeśli nie mamy w systemie GIMP-a, korzy-
stając wyłącznie z linii komend, możemy przy 
pomocy  programu  xcf2png  spłaszczyć  plik
XCF  i  skonwertować  do  formatu  PNG.  Wy-
starczy  podać  nazwę  pliku  źródłowego  i  po 
opcji - o nazwę wyjściowego pliku PNG. Pro-
gram xcf2png znajdziemy w pakiecie xcftools.

Gdy już skończymy zabawę z obrazka-

mi, być może chcielibyśmy przesłać je pocz-
tą elektroniczną? To oczywiście też jest moż-
liwe  z  linii  komend.  Pomocny  będzie  pro-
gram  biabam,  dostępny  w  większości  dys-
trybucji. Jego podstawowe użycie z jednym 
plikiem i jednym adresatem może wyglądać 
następująco:

biabam plik.jpg -s 
      "temat listu"
            adres@odbiorcy.com.

Po wydaniu tego polecenia program popro-
si o wpisanie treści maila. Aby zakończyć, na-
leży w pustej linii (czyli po naciśnięciu [En-
ter
]) nacisnąć [Ctrl]+[d]. Poczta zostanie wy-
słana  przy  użyciu  lokalnie  dostępnego  ser-
wera SMTP, który oczywiście musi być skon-
figurowany. 

Rysunek 1. 

Plik PDF wraz z dołączonym znakiem 

wodnym