středa 1. ledna 2014

Jak jsem dělal PF

Použil jsem Image Magick, což je balík progrmů, který je doma spíše na linuxu. Nicméně uvedené příkazy by měly fungovat i na jeho windowsovské verzi, protože na windows nefungují pouze ty části balíku, které něco vykreslují na ploše (hlavně programy display a animate). Teoreticky se to dá řešit instalací zobrazovacího systému X-windows do windows, což je ovšem úkon natolik netriviální, že instalace nějaké rozumné linuxové distribuce coby druhého operačního systému je proti tomu vcelku brnkačka (o spuštění nějaké live distribuce z DVD či USB zařízení ani nemluvě).




Na počátku byl soubor PF_zakl.jpg, který vznikl ve fotoaparátu a je na něm několik misek s narostlými plísněmi. Ten jsem zkonvertoval do formátu ppm příkazem:
convert PF_zakl.jpg PF_zakl.ppm

Konverzi jsme provedl proto, že se jedná o formát
a- bezztrátový, tj. při manipulacích s ním nedochází ke snížení kvality
b- výpočetně jednoduchý, takže počítač nemusí při každé manipulaci s obrázkem dekomprimovat a komprimovat data
c- uchovává jen data o barvě pixelů


Následně jsem provedl výřez:
convert PF_zakl.ppm -crop 835x835+837+1047 Vyrez.ppm
Parametry příkazu crop AxB+[-]C+[-]D říkají: Vyřízni ze zadaného obrázku výřez o stranách x=A, y=B, přičemž pozice levého horního rohu je na souřadnicích x=C a y=D (počítáno od levého horního rohu originálního obrázku). Jsou -li parametry C nebo D (nebo oba) záporné, "začíná" výřez mimo původní obrázek. Pokud součty parametrů A+C nebo B+D přesahují šířku či výšku obrázku, "končí" výřez za hranicí originálního obrázku.
V případě použití formátu ppm (nebo dalších z této rodiny) se nic neděje, ale např. u png některé editory zobrazují plochu mimo originální obrázek jako pruh nebo "L" z průhledných pixelů.
Parametry A,B,C a D jsme nalezl zkusmo.


Následně jsem z výřezu udělal negativ:
convert Vyrez.ppm -negate Negativ.ppm

Poté jsem, opět zkusmo, maloval na výřez černý kruh, dokud jsem nedostal takový, jehož hranice by pokud možno splynuly s hranicemi půdy na misce:
convert Vyrez.ppm -fill black -draw 'circle 419,418,419,825' Pokus.ppm
Příkaz říká, že kruh bude vyplněn černou barvou, první dva parametry příkazu circle jsou souřadnice středu kruhu, další dva jsou souřadnice libovolného bodu na jeho obvodu (což se hodí, když např. konstruujeme kruh, který se má dotýkat rohu čtverce, který není svisle nebo vodorovně zarovnám se středem kruhu; pokud potřebujeme jen kruh o definovaném poloměru, zadáváme vlastně jedno číslo zbytečně).
Když jsem byl spokojen s výsledným kruhem, vytvořil jsem si dva pomocné obrázky:
A. Vytvořil jsem čisté bílé plátno, jako podklad budoucího obrázku:
convert -size 835x835 xc:white Podklad.ppm
Konstrukce -size XxY xc:barva vytvoří plochu o velikosti X krát Y pixelů a vyplní ji barvou barva. V rámci jednoho příkazu je možné na ni kreslit (jak je vidět dále).

B. Vytvořil jsem pomocný obrázek, na kterém jem testoval rozmístění písmen:
convert -size 835x835 xc:white -fill black -draw 'circle 419,418,419,825' Pom2.ppm
a využil jsem ho rovněž jako masku k překopírování plochy s obrázkem půdy na misce na bílou plochu:
composite Podklad.ppm Vyrez.ppm Pom2.ppm P1.ppm

Na pomocný obrázek jsem rozvrhl nápis, červenou jsem zvolil, aby byla kontrastní jak od podkladu tak od kruhu:
convert Pom2.ppm -fill red -font Palatino-Bold -pointsize 128\
                 -draw "text 355,200'PF'"\
                 -draw "text 300,340'2014'"\
                 -font Palatino-BoldItalic -pointsize 142\
                 -draw "text 50,545'A. S. Pergill'"\
                 NahledASP.ppm
Protože je příkaz dosti dlouhý, využil jsem pokračovací řádky (ukončené obráceným lomítkem).
Když jsem byl spokojen s velikostí a rozvržením písmen, vytvořil jsem z nich masku na čisté plátno:
convert -size 835x835 xc:white -fill black -font Palatino-Bold -pointsize 128\
                 -draw "text 355,200'PF'"\
                 -draw "text 300,340'2014'"\
                 -font Palatino-BoldItalic -pointsize 142\
                 -draw "text 50,545'A. S. Pergill'"\
                 MaskaNapisASP.ppm

Nakonec jsem přes masku aplikoval nápis v negativu na obrázek misky:
composite P1.ppm Negativ.ppm MaskaNapisASP.ppm PFASP.ppm
Příkaz composite A B C D znamená, že na obrázek A se promítne obrázek B, ale jen tam, kde je na obrázku C černá (když je tam šedá, dojde k prolnutí obou obrázků, asi jako dvojexpozice) a výsledek se uloží do obrázku D

A výsledek jsem ještě zmenšil a současně převedl do formátu jpg, aby návštěvníci blogu nestrhali tarify
convert PFASP.ppm -resize 50% PFASP.jpg

Přehled použitých obrázků jsem vygeneroval příkazem:
montage -label '%f' PF_zakl.jpg PF_zakl.ppm Vyrez.ppm Negativ.ppm Pokus.ppm \
Podklad.ppm Pom2.ppm P1.ppm NahledASP.ppm MaskaNapisASP.ppm \
PFASP.ppm PFASP.jpg -tile 5x3 -geometry 150x170+2+2 Prehled.ppm
Příkaz říká, že obrázky budou zobrazeny se svými názvy, zmenšeny tak, aby se vešly do obdélníku 150x170 a mezi obdélníky budou vodorovně i svisle dvoupixelové mezery a vše bude rozmístěno jako 5 dílčích obrázků na šířku a tři na výšku.

a i ten jsem převedl do jpg:
convert Prehled.ppm Prehled.jpg

2 komentáře:

  1. Zdeněk Žíkovecký2. ledna 2014 v 9:51

    A nebylo by jednodušší použít Gimp?

    OdpovědětVymazat
    Odpovědi
    1. Vlastně se s těmi dílčími obrázky pracuje v principu stejně jako s vrstvami v GIMPU. Nicméně jsem to zkoušel a měl jsem permanentní problémy si v nich udržet pořádek. Tohle je mé letoře přirozenější. Je ale nutno říct, že jsem "odkojen" 8bitovimy počítači, jako Spektrum (resp. Didaktik gama) nebo PMD 85.

      Vymazat