Pomoc:Obróbka plików graficznych pod Linuksem

Podstawy

edytuj

Ogólne uwagi

edytuj
Ta strona pomocy ma charakter luźnych uwag i wskazówek. Wymienione są różne narzędzia i triki, dzięki którym można osiągnąć zamierzony efekt. Nie jest wyjaśniane, jak wykonać daną czynność krok po kroku ale wskazywany możliwy kierunek.

Konsola

edytuj
O ile użytkownicy windows stosunkowo rzadko używają konsoli (cmd, powershell), o tyle wśród linuksowców jest to bardzo popularne i wygodne narzędzie pracy. Jest to bardzo potężne narzędzie, szybko i precyzyjnie można wykonać stosunkowo skomplikowane działania.

Konieczna wiedza wstępna

edytuj
  • pomoc dla programów cli
    • foo -h lub foo --help
    • man foo
    • info foo
    • wyszukiwarka
  • system plików
    • cd (zmiana katalogu roboczego)
    • mv (zmiana nazwy pliku niebezpieczne)
    • rm (usuwanie pliku niebezpieczne)
    • względne nazwy pliku ../../foo.baz
    • Globing (czyli *, ?, [0-9])
    • unikanie spacji w nazwach
      • cudzysłowy utrzymujące nazwę
for f in *; do mv "$f" $(echo $f | tr ' ' '_'); done
  • tworzenie kolejnych liczb
    • {1..12} → 1 2 3 4 5 6 7 8 9 10 11 12
    • {08..12} → 08 09 10 11 12
    • {33..29} → 33 32 31 30 29
    • {2..10..2} → 2 4 6 8 10
  • zmienne
    • $i
    • ${i}
  • pętle
    • for i in ...; do ...; done
    • for (( i=0; i<=10; i+=2 )); do ...; done
  • wynik jakiegoś polecenia/programu
    • $(...)
    • ` ... `
  • pipe (potok)
  • obliczenia (ewentualnie)
    • i=10; echo $((i-1)) → 9
    • i=11; echo $((i%2)) → 1
    • i=11; echo $((i/2)) → 5
  • testy przy pomocy komendy echo

Uzyskanie właściwej kolejności plików

edytuj
Standardowo globing zwraca wszystkie nazwy pasujące do danego wzorca w kolejności alfabetycznej, np.:
for i in foo*.jpg; do echo $i; done
foo1.jpg foo10.jpg foo11.jpg foo12.jpg foo13.jpg foo14.jpg foo15.jpg foo16.jpg foo17.jpg foo18.jpg foo19.jpg foo2.jpg foo20.jpg foo21.jpg ...
Jeśli w nazwie występuje tylko jedna liczba, właściwą kolejność można uzyskać przez:
for i in foo[0-9].jpg foo[0-9][0-9].jpg foo[0-9][0-9][0-9].jpg; do echo $i; done


Wiodące zera

edytuj
Oczywiście problem nie wystąpi, gdy liczby mają jednakową długość (są zapisane z zerami):
foo001.jpg foo002.jpg ... foo893.jpg
Przy pomocy poniższych miniskryptów można dostosować nazwy plików:
for i in {0009..1009} ; do k=$(expr $i + 0) ; mv foo$k.jpg bar$i.jpg; done 
for x in {9..1009} ; do y=$(printf "%04d\n" $x); mv foo$x.jpg bar$y.jpg; done 
a=0000 ; for i in {9..1009}; do k=${a:${#i}:${#a}}${i} ; mv foo$i.jpg bar$k.jpg; done 
 a=0000; b='foo*.jpg'; for c in $b ; do i=${c:$(($(expr index $b '*')-1)):$((${#c}-${#b} + 1))}; k=${a:${#i}:${#a}}${i} ; echo $i ; mv $c bar$k.jpg; done 
Uwaga: Działa dla jednej liczby w środku nazwy pliku, koniecznie należy wcześniej przetestować.


Gdy osobno były skanowane/fotografowane strony nieparzyste i parzyste może być konieczne dostawienie dodatkowej cyfry (np. 0 i 5):
for x in {0009..1009} ; do mv foo$x.jpg bar${x}0.jpg; done 

Obróbka jednego zdjęcia (skanu)

edytuj

Manualna

edytuj

Pinta – drobne zmiany

edytuj
  • wśród narzędzi zaznaczenie prostokątne
    • Ctrl + C (=kopiowanie do schowka)
  • pliki → nowy → nowy obraz (wielkość domyślna wynika z wielkości obrazka znajdującego się w schowku)
  • wśród narzędzi pipetka
  • wśród narzędzi pędzel
    • szerokość pędzla zazwyczaj dużo większa (40-50)
  • wśród narzędzi stempel klonujący
  • Dostosowanie kolorów
    • jasność/Kontrast
    • krzywe
    • redukcja kolorów
  • Obraz
    • obrót
  • Plik → zapisz jako

Gimp – zaawansowane zmiany

edytuj

Ponieważ szczegółowe omówienie możliwości, jakie daje ten program znacząco by przekroczyło ramy niniejszej strony pomocy, poniżej podane są jedynie najważniejsze użyteczne narzędzia:

  • Narzędzia → Narzędzia zaznaczania → Zaznaczenie prostokątne
  • Narzędzia → Narzędzia przekształcania → Perspektywa
  • Narzędzia → Narzędzia przekształcania → Obrót
  • Narzędzia → Narzędzia rysowania → Pędzel
  • Plik → Utwórz ze schowka
  • Plik → Wyeksportuj jako

Zautomatyzowana

edytuj
Przygotowanie zestawu skanów do zamieszczenia na commons i wykorzystania w projekcie Wikiźródeł może zabrać nam mniej lub więcej czasu i wysiłku. Przy kilku pojedynczych skanach jest z reguły łatwiej przyciąć j interaktywnie (np. Pinta, ew. Gimp). Gdy takich skanów/zdjęć do indywidualnej obróbki jest więcej, jest to żmudne i czasochłonne. Jeśli obrazy mają ten sam układ, można proces zautomatyzować i na przykład z lewej strony każdego obciąć 300 pikseli, zaś z dołu 500... Warto uwzględnić to już przy planowaniu i na przykład robić zdjęcia ze statywu, prostopadle do papieru, nie przesuwając książki względem aparatu przy przekładaniu stron. Albo kłaść tekst na skanerze za każdym razem w tym samym położeniu...

Dzielenie stron na pół

edytuj
Polecenie convert z programu ImageMagick daje dostęp do ogromnej liczby przekształceń obrazów. Poniżej przedstawione będą jedynie te podstawowe, przydatne przy prostej obróbce skanów lub zdjęć zawierających tekst.
convert -crop 50%x100%  +repage foo.TIF bar%d.pbm
for i in {10..52} ; do convert -crop 50%x100%  +repage foo$i.TIF bar$i%d.pbm ; done
Powyżej wykonano jednocześnie konwersję do innego formatu. Otrzymuje się z oryginalnego skanu dwie strony. Zmienna %d daje numer części.

Kadrowanie (crop)

edytuj
convert foo.jpg -gravity Center -crop 96%x82%-0+60 -rotate 270 -strip bar.jpg
 for i in {10..52}; do convert foo$i.jpg -gravity Center -crop 96%x82%-0+60 -rotate 270 -strip bar$i.jpg; done
 for i in {10..52}; do convert foo$i.png -gravity Center -crop 96%x82%-0+60 -rotate 270 -strip bar$i.pbm; done
Odpowiednie parametry przy kadrowaniu trzeba dobrać metodą prób i błędów.

Konwersja plików wielostronicowych (pdf, djvu) do jednostronicowych etc.

edytuj

Wstęp

edytuj

Zasadniczo rzecz biorąc należy takich konwersji unikać, gdyż pliki wielostronicowe są z reguły skompresowane stratnie i kolejne przekształcenie pogorszy jakość.

  • Wszystkie strony są przekształcane na pojedyncze obrazki, numerowane trzycyfrowo (001, 002, ...)
convert -density 150 foo.pdf -quality 90 bar-%3d.png
  • Jak wyżej ale zmniejszana o  50%
convert -density 150 foo.pdf -quality 90 -resize 50% bar-%3d.png
  • Jedna strona (tu strona numer  1  ) jest przekształcana na obrazek w formacie jpg
convert -density 150 foo.pdf[0] -quality 90 bar.jpg
Uwagi: liczba w nawiasie kwadratowym to numer strony, strony pdf-u są numerowane od zera.
  • Strony z zakresu są przekształcane na obrazki w formacie png (strony od  2  do  10  )
convert -density 150 foo.pdf[1-9] -quality 90 bar.jpg
Należy zwrócić uwagę, że parametr density określa liczbę pikseli wynikowego pliku, musi być podany jako pierwszy (jeszcze przed nazwą pdf-u)
  • Alternatywnie można jedną stronę skonwertować do innego formatu graficznego na przykład przy pomocy Gimpa (otworzyć dany plik importując tylko jedną stronę → Plik → Wyeksportuj jako)

Program ddjvu umożliwia konwersję w konsoli do kilku formatów (pbm,pgm,ppm,pnm,rle,tiff). Najlepszą jakość zapewnia z reguły tiff.

  • Wszystkie strony są przekształcane na pojedyncze obrazki numerowane kolejno (1, 2, ...)
ddjvu -format=tiff -eachpage foo.djvu bar-%d.tiff
  • Jak wyżej ale zmniejszana o  50%
ddjvu -format=tiff -eachpage -scale=50% foo.djvu bar-%d.tiff
  • Jedna strona (numer  1 ) jest przekształcana na obrazek w formacie tiff
ddjvu -format=tiff -page=1 foo.djvu bar.tiff
  • Zakres stron  1-6  (ale również może być nieciągły np: -page=1-7,23,30-80) jest przekształcany na obrazki w formacie tiff
ddjvu -format=tiff -page=1-6 foo.djvu bar-%d.tiff
  • Alternatywnie można jedną stronę skonwertować do innego formatu graficznego przy pomocy DjView4 (File → Export)

Konwersja jednej strony do innego formatu

edytuj

→ PDF

edytuj

img2pdf

edytuj
img2pdf --output bar.pdf foo.jpg
możliwe jest również scalenie wielu stron w jednym kroku:
img2pdf --output bar.pdf foo1.jpg foo2.jpg foo3.jpg
img2pdf --output bar.pdf foo*.jpg

convert (ImageMagick)

edytuj
Uwaga standardowo konwersja do pdf jest niedostępna.[1]


convert -density 300 foo.jpg bar.pdf
Można również z wielu plików graficznych (obrazków) utworzyć pojedynczy pdf:
convert foo* -page 100%x100% bar.pdf 

Ghostscript

edytuj
gs -sDEVICE=pdfwrite -o bar.pdf /usr/share/ghostscript/9.26/lib/viewjpeg.ps -c \(foo.jpg\) viewJPEG 
for i in {117..144} ; do gs -sDEVICE=pdfwrite -o bar$i.pdf /usr/share/ghostscript/9.26/lib/viewjpeg.ps -c \(foo$i.jpg\) viewJPEG ; done 


Wersja (ścieżka) ghostscriptu musi być odpowiednio dostosowana.

→ DjVu

edytuj

png pbm tiff

edytuj
bichromatyczne (czarnobiałe) pbm → DjVu, tif → DjVu
edytuj
cjb2 -clean foo.pbm bar.djvu 
for i in foo*.pbm ; do cjb2 -clean $i ${i##*.}.djvu ; done 
png → DjVu
edytuj
Konwersja możliwa przez bezstartny format pośredni (pbm)
convert foo.png baz.pbm ; cjb2 baz.pbm bar.djvu 
for i in foo*.png ; do convert $i bar.pbm; cjb2 bar.pbm ${i##*.}.djvu ; done 

jpg → DjVu, pgm → DjVu

edytuj
c44 foo.jpg bar.djvu
for i in foo*.jpg; do c44 $i ${i##*.}.djvu ; done 
Wyższa jakość np.:
c44 -slice 72,83,93,103 foo.jpg bar.djvu
for i in foo*.jpg; do c44 -slice 72,83,93,103 $i ${i##*.}.djvu ; done 
użyteczny bywa również parametr -decibel (od 16 do 48) określający próg rozróżniania pikseli, im wyższy tym wyższa jakość.

didjvu

edytuj
Konwertuje pojedyncze strony do formatu DjVu. Wynikowe pliki są wysokiej jakości i stosunkowo niewielkie.
didjvu encode -clean -d 600 -o bar.djvu foo.tif
Lub dla uzyskania od razu pliku djvu z całego szeregu skanów:
didjvu bundle -clean -d 600 -o bar.djvu foo*.tif
Opcja -clean powoduje usunięcie drobnych, z reguły przypadkowych kropek, odpowiada opcji -losslevel 1 . Opcja -d 600 określa rozdzielczość.

Scalanie lub dzielenie plików pdf i djvu

edytuj
  • Scalenie wielu plików pdf
pdftk cat foo*.pdf output bar.pdf
  • Rozbicie jednego pliku pdf na pojedyncze strony (pdf)
pdftk foo.pdf burst output bar_%03d.pdf
kolejne strony (pliki) numerowane bar_001.pdf bar_002.pdf itd.
  • Scalenie dwóch plików pdf
pdftk A=foo1.pdf B=foo2.pdf cat A B output bar.pdf
  • Wyodrębnienie pierwszych  10  stron pliku
pdftk A=foo.pdf cat A1-10 output bar.pdf
  • Wyodrębnienie stron od  10  do  20  i obrót
pdftk A=foo.pdf cat A10-20east output bar.pdf
  • Wyodrębnienie pierwszych  10  stron z pierwszego pliku, całego drugiego, stron  17 ÷ 20  z trzeciego i stron  15 ÷ do końca z czwartego
pdftk A=foo1.pdf B=foo2.pdf C=foo3.pdf D=foo4.pdf cat A1-10 B C17-20 D15-end output bar.pdf
  • Wtasowanie stron z dwóch plików (np. jeden zawiera strony nieparzyste, drugi – parzyste)
pdftk A=odd.pdf B=even.pdf shuffle A B output bar.pdf
  • Wtasowanie stron z dwóch plików ale strony parzyste są w odwrotnej kolejności
pdftk A=odd.pdf B=even.pdf shuffle A Bend-1 output bar.pdf
  • Wtasowanie stron z jednego pliku (najpierw strony nieparzyste 1÷X, potem parzyste X+1÷do końca) (niech X będzie  333 )
pdftk A=odd.pdf B=even.pdf shuffle A1-333 Bend-334 output bar.pdf

DjView4

edytuj
  • Po otwarciu pliku można zapisać część pliku (efektywnie podzielić plik):
    • File → Save as (wybrać zakres stron)
  • Można przeprowadzić konwersję dokumentu pośredniego (indirect) do spakowanego (bundled).[2] Otwierany jest przy tym plik indeksowy i zapisywany jako jeden spakowany dokument.
  • usunięcie strony  333
djvm -d foo.djvu 333
  • dodanie do pliku foo.djvu strony bar.djvu, tak by była na końcu pliku
djvm -i foo.djvu bar.djvu
  • dodanie do pliku foo.djvu strony bar.djvu, tak by ta strona miała numer  333 , następne strony są przesuwane
djvm -i foo.djvu bar.djvu 333
W ten sam sposób, jak powyżej można również scalić dwa wielostronicowe pliki.
  • usunięcie strony  333  i dodanie do pliku foo.djvu strony bar.djvu, tak by ta strona miała numer  333
djvm -d foo.djvu 333; djvm -i foo.djvu bar.djvu 333
Uwaga: Kolejność operacji jest tak dobrana, by numer stron się powtarzał.
  • Przy wstawieniu (lub usuwaniu) większej liczby stron warto proces odpowiednio zaplanować, korzystnie jest zaczynać „od góry” by uniknąć potrzeby prowadzenia na bieżąco obliczeń
  • scalenie pliku djvu z pojedynczych stron
djvu -c bar.djvu foo*.djvu
  • Konwersja jpg → djvu i dołączenie do pliku
c44 bar.jpg baz.djvu; djvm -i foo.djvu baz.djvu; rm. baz.djvu
for i in bar*.jpg; do c44 $i baz.djvu; djvm -i foo.djvu baz.djvu; done; rm baz.djvu
Nieco lepszy efekt może dać użycie programu didjvu.

Obróbka wielostronicowych plików (na przykład kadrowanie)

edytuj

Obróbka pdf-ów

edytuj

Kadrowanie pliku pdf

edytuj
Co najmniej dwa programy (skrypty) mogą zostać użyte do kadrowania pliku pdf (pdfjam i pdfcrop). Możliwe jest również użycie Ghostscriptu, choć plik wynikowy jest z reguły znacznie większy a polecenie bardziej skomplikowane.
Poniżej można znaleźć kilka przykładów
pdfjam pdfcrop
pdfjam --trim '100 0 0 0' --keepinfo foo.pdf -o bar.pdf
pdfjam --trim '0 0 100 0' --keepinfo foo.pdf -o bar.pdf
pdfcrop --margins '-100 0 0 0' foo.pdf bar.pdf
pdfcrop --margins '0 0 -100 0' foo.pdf bar.pdf
Z reguły pdfjam daje mniejsze pliki i działa szybciej.
Właściwe marginesy można ustalić metodą prób i błędów (lewy margines, dolny, prawy, górny). Wielkość strony (jeśli cały dokument ma jednolitą wielkość stron) można wyznaczyć przy pomocy:
pdfinfo foo.pdf
gdzie szukamy wyniku:
Page size:      595.276 x 841.89 pts (A4) (rotated 0 degrees)
Ewentualnie można skorzystać z polecenia:
pdfinfo foo.pdf | grep "Page size:" 
które nam wyświetli od razu odpowiedni wynik.

Konwersja pliku pdf zawierającego dwie strony na jednym skanie

edytuj
Utworzenie pliku pdf z pojedynczymi stronami, gdy mamy jedynie plik z dwoma stronami na jednym skanie wymaga trzech kroków:
  1. utworzenia pdf-u ze stronami nieparzystymi przez odpowiednie wykadrowanie
  2. utworzenie pdf-u ze stronami parzystymi przez wykadrowanie
  3. połączenie tych plików przy pomocy pdftk

Zmiana rozdzielczości pdf-u

edytuj
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=foo.pdf bar.pdf
Parametr rozdzielczości (-dPDFSETTINGS) może przyjmować jedną z predefiniowanych, poniższych wartości:
  • -dPDFSETTINGS=/screen – (72 dpi)
  • -dPDFSETTINGS=/ebook – (150 dpi)
  • -dPDFSETTINGS=/prepress – (300 dpi)
  • -dPDFSETTINGS=/printer – (300 dpi)
  • -dPDFSETTINGS=/default

Obróbka DjVu

edytuj

Proste operacje

edytuj
Program djvused umożliwia wykonanie prostych operacji z poszczególnymi stronami z pliku djvu np.:
  • wycięcie jednej strony (możliwe również przy pomocy DjView)
  • obrót strony
  • ekstrakcję tekstu
  • informacje o wielkości stron
  • usunięcie metadanych itp.
Dla przykładu polececenie:
djvused -e 'select 333; save-page-with p05.djvu'
wybiera z dokumentu stronę  333  i zapisuje jako osobny dokument.
zaś polecenie
djvused -e 'select 333; set-rotation +3; save-page-with p05.djvu'
obraca tę stronę o  3  × 90° w lewo (możliwe wartości 0, 1, 2, 3).

Uwaga ogólna

edytuj
Przy pomocy popularnych narzędzi nie można kadrować plików DjVu, jeśli byłoby to konieczne, należałoby stratnie skonwertować plik do pojedynczych obrazków (tiff) by następnie po obróbce je scalić.

Konwersja pliku djvu zawierającego dwie strony na jednym skanie

edytuj
Niestety konieczna jest konwersja na pliki jednostronicowe (np. tiff) – co się wiąże z pogorszeniem jakości i z utratą warstwy tekstowej, wykadrowanie i scalenie.
ddjvu -format=tiff -page=1 foo.djvu baz.tiff; convert baz.tiff qux.jpg ; c44 qux.jpg bar.djvu; for i in {1..150}; do ddjvu -format=tiff -page=$i foo.djvu baz.tiff; convert -crop 50%x100%  +repage baz.tiff baz%d.jpg; c44 qux.jpg baz.djvu; djvm -i bar.djvu baz.djvu; c44 plugh.jpg baz.djvu; djvm -i bar.djvu baz.djvu; done; rm baz.tiff qux.jpg plugh.jpg baz.djvu; djvm -d bar.djvu 1 
Wyjściowy plik to foo.djvu, wynikowy plik to bar.djvu, po drodze są tworzone pliki baz.tiff qux.jpg plugh.jpg baz.djvu . Oczywiście konieczne jest dostosowanie nazw, liczby stron ale i zadbanie by przypadkiem nie było plików tymczasowych o kolidujących nazwach.
Liczba stron dokumentu powyżej jest podana jako  150 . Można ją ustalić oczywiście otwierając dokument w przeglądarce. Na potrzeby skryptu można liczbę stron ustalić przy pomocy polecenia:
djvused -e n foo.djvu
Kompletne polecenie miałoby formę:
infile=foo.djvu; outfile=bar.djvu; ddjvu -format=tiff -page=1 $infile baz.tiff; convert baz.tiff qux.jpg ; c44 qux.jpg $outfile; for (( i=1; i<=$(djvused -e n $infile); i++ )); do ddjvu -format=tiff -page=$i $infile baz.tiff; convert -crop 50%x100%  +repage baz.tiff baz%d.jpg; c44 qux.jpg baz.djvu; djvm -i $outfile baz.djvu; c44 plugh.jpg baz.djvu; djvm -i $outfile baz.djvu; done; rm baz.tiff qux.jpg plugh.jpg baz.djvu; djvm -d $outfile 1 

Konwersja PDF ↔ DjVu

edytuj

DjVu → pdf

edytuj

DjView4

edytuj
Przy pomocy DjView4 można wyeksportować cały plik lub jego część do innego formatu (w tym pdf)
  • File → Export
W linii poleceń można skonwertować plik DjVu do pdf‑ przez polecenie:
ddjvu -format=pdf -quality=85 -verbose foo.djvu bar.pdf
Plik wynikowy jest stosunkowo duży

djvups i ps2pdf

edytuj
Alternatywnie można skorzystać z polecenia:
djvups foo.djvu | ps2pdf - bar.pdf

PDF → DjVu

edytuj

pdf2djvu

edytuj
pdf2djvu foo.pdf -o bar.djvu
Lepszą jakość i większy plik można uzyskać przez:
pdf2djvu --bg-slices=72,83,93,103 -d 600 foo.pdf -o bar.djvu

DjVuDigital

edytuj
To bardzo efektywny program do kowersji z formatu pdf (lub ps) do djvu. Niestety instalacja wymaga specjalnej wersji Ghostscripta (samodzielnie kompilowanej). Procedura nie jest skomplikowana ale czasochłonna. (por. gsdjvu).
Wynikowy plik djvu jest wysokiej jakości i z reguły mniejszy, niż otrzymywany innymi metodami
Należy jeszcze dodać, że w przypadku plików zawierających obrazki w formacie JPEG2000 (inaczej JPX) inne metody nie prowadzą do celu.

Ściągawka

edytuj
 
obrazek pdf djvu
obrazek
Pinta

Gimp


convert
Gimp
convert
 
img2pdf
 
ghostscript
c44
cjb2
didjvu
pdf
Gimp



convert
pdftk MMM..(scalanie, dodawanieusuwanie stron)
pdfjam/pdfcrop MMMMMMMMMMMMMMM(kadrowanie)
pdfjam/pdfcrop + pdftk MMMMMMMMMMM..(    )
ghostscript MMMMM..(redukcja rozdzielczości)
pdf2djvu

DjVuDigital
djvu
DjView4




ddjvu
DjView4

ddjvu

djvups + ps2pdf
DjView4 MMMM..(djvu z zakresu stron wyjściowego pliku)
djvm MMMMMMMMMM(scalanie, dodawanieusuwanie stron)
djvused  MMMMMM (ekstrakcja strony, obracanie strony)
ddjvu + convert + c44/cjb2 + djvm M(kadrowanie,   →   )





  1. Należy:
    Znaleźć /etc/ImageMagick-6/policy.xml i otworzyć (z uprawnieniami administratora sudo)
    Zmienić
    policy domain="coder" rights="none" pattern="PDF"
    na:
    policy domain="coder" rights="read|write" pattern="PDF"
    Porównaj image to pdf
  2. Dokument pośredni składa się z pliku indeksowego i wielu plików .djvu, z których każdy odpowiada jednej stronie. Plik spakowany zawiera cały dokument w jednym pliku – tak, jak jest to używane przy wysyłaniu na Commons.