Zobrazují se příspěvky se štítkemImage Magick. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemImage Magick. Zobrazit všechny příspěvky

sobota 16. srpna 2014

Jak jsem dělal duhokolóru

Protože jsem chtěl předchozí příspěvek vylepšit šestibarevným symbolem hnutí LGBT a současně jsem nechtěl stahovat nějaký obrázek s problémovými autorskými právy, rozhodl jsem se ho vygenerovat sám.
Nakonec jsem sáhl po metapostu (prostě proto, že jeho syntaxi umím nejlíp). V úvahu by padalo i přímé generování bitmapy ImageMagickem nebo programem v perlu (či jiném programovacím jazyce), který by to vyplivl jako blok binárních dat. Nicméně tyhle postupy bych musel dělat "s příručkou na kolenou", protože obsahují řadu konstrukcí, které jsou syntakticky poměrně obtížné a z pohledu mých programátorských zkušeností i neobvyklé.

Takže jsem vyrobil následující program:
prologues:=1; %kreslící plocha nastavena na obdélník opsaný
              %vykresleným grafickým prvkům
u=1mm; %definice základní délkové jednotky
color barva[];   %deklarace pole barev, následují definice barev
barva0:=blue;    %(0,0,1)
barva1:=(0,1,1); %cyan
barva2:=green;   %(0,1,0)
barva3:=(1,1,0); %yellow
barva4:=(1,.5,0);%orange
barva5:=red;     %(1,0,0)
beginfig(1);     %začátek obrázku
z0=origin;       %(0,0)
z1=(0u,15u);z2=(5u,15u);z3=(5u,0u); %definice rohů prvného obdélníka
z100=(5u,0);     %pomocná proměnná pro posun
for i=4 upto 23: z[i]=z[i-4]+z100;endfor; %definice rohů dalších obdélníků
%vykreslení barevných obdélníků cyklem:
for i=0 upto 5:a:=4*i;
fill z[a+0]--z[a+1]--z[a+2]--z[a+3]--cycle withcolor barva[i];endfor;
endfig; %konec obrázku
end;    %konec programu

Napravo od znaku % jsou konentáře, které metapost nezpracovává a které jsou zde doplněny pro lepší orientaci čtenáře.
Výsledkem byl soubor Duha.1 ve formátu encapsulated postscript (=samostatný obrázek, vložitelný do jiného postscriptového souboru a mající velikost odpovídající jen tomu, co je tam nakresleno)

Tento obrázek jsem převedl na jpg příkazy shellu:
# Spuštění metapostu nad pogramem k vykreslení obrázku
mpost Duha.mp
# Konverze výstupu z metapostu (postscript) na jpg
# program convert z balíku ImageMagick
convert Duha.1 Duha.jpg

Zde jsou komentáře uvedeny znakem #

Takže jsem ten ImageMagick nakonec použil na konverzi do formátu jpg (na windows by se asi použil IrfanView).

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