Kadrowanie zdjęć przy użyciu tylko narzędzi wiersza poleceń

34

Chcę wykadrować obraz na moim Ubuntu tylko z interfejsem CLI przy użyciu narzędzia wiersza poleceń wskazującego tylko piksele do kadrowania dla czterech kierunków. (tak samo jak w libreoffice)

Na przykład:

crop image.jpg -top 5px -bottom 7px -right 14px -left 3px

Czy istnieje takie narzędzie (nie GUI)?

Maythux
źródło
@ThomasWeller to pyta o wiersz poleceń, a nie narzędzie GUI, a dołączone przez ciebie pytanie dotyczy GUI, więc proszę ponownie przeczytaj pytanie
Maythux
2
Połączone pytanie nie określa typu narzędzia. Druga odpowiedź dotyczy narzędzia wiersza poleceń: imagemagick. Wiem, że toczą się dyskusje na temat SO, czy pytanie jest duplikatem, jeśli odpowiedź jest taka sama. Ludzie mogą się zgodzić lub nie.
Thomas Weller
1
@ThomasWeller, ale odpowiedź nie jest wygodna, a ponadto nie pokazuje, w jaki sposób i dlaczego skorzystał z opcji. Sam nie mogę uzyskać tych informacji, to tylko pierwsza odpowiedź tutaj, bez żadnego wyjaśnienia, co powoduje, że odpowiedź jest niskiej jakości
Maythux
@downvoters Czy powinienem wiedzieć, co się z tobą dzieje? !!
Maythux,

Odpowiedzi:

38

Oto obejście problemu convertz pakietu magii obrazu.

sudo apt-get install imagemagick

Na zdjęcie image.jpg

$ identify image.jpg 

image.jpg JPEG 720x482 720x482+0+0 8-bit DirectClass 100KB 0.000u 0:00.009

Jak pokazano powyżej, obraz wejściowy to 720 x 482 pikseli.

Teraz, aby wykonać kadrowanie, musisz określić dwa czynniki:

  1. punkt początkowy kadrowania (obejmuje 2 kierunki)
  2. Rozmiar przyciętego prostokąta (tutaj możesz uwzględnić inne kierunki)

Wróćmy do image.jpgpowyższego obrazu , chcę przyciąć:

  • top 5px
  • dolna 7px
  • prawo 14px
  • w lewo 3px

możesz to zrobić w formacie ( widthx height+ left+ top/ wx h+ l+ t):

convert image.jpg -crop 703x470+3+5 output.jpg

Teraz

$ identify output.jpg 

output.jpg JPEG 703x470 703x470+0+0 8-bit DirectClass 102KB 0.000u 0:00.000
Maythux
źródło
2
Mówi się, że Imagemagick 7 używa polecenia „magia” zamiast „konwertować”. Jeśli ktoś command not found: convertmagick
napotka
1
To była wielka pomoc, ale zajęło mi trochę czasu, aby owinąć głowę wokół „obliczeń”. Miałem zestaw 1280x1024 obrazów, z których musiałem przyciąć górę i dół, więc ostateczny obraz miałby „środkowe” 718 pikseli od oryginału (zdejmując czarny pas u góry iu dołu). Musiałem użyć tego: convert in.png -crop 1280x718+0+152 out.pnggdzie rozumiem tę linię, co oznacza: convert in.png -crop [final-right-x]x[final-right-y]+[crop-left]+[crop-top] out.pngchociaż to nie wydaje się zgadzać z liczbami @ Maythux ... FWIW!
Dɑvïd
3
Nie powinno być 703x470zamiast 713x470? Jak przycinanie w lewo + w prawo = 3+14 = 17px, to po odjęciu 720jest 703, a nie 713.
Mooncrater
To pomogło! Zaproponowałem również edycję FIX zarówno dla formatu 703px zamiast 713px (na co się zgadzam), jak i odwróconego formatu lewy i górnyWxH+l+t
el-teedee
12

Jeśli chcesz przyciąć białe regiony, masz imagemagickspecjalne polecenie:

convert -trim input.jpg output.jpg
Martin Thoma
źródło
9

Aby utworzyć opcję „przyjazną dla użytkownika”, można użyć poniższego skryptu. Po prostu uruchom polecenie:

<script> <image> <crop_left> <crop_right> <crop_top> <crop_bottom>

Tworzy przycięty obraz o image.jpegnazwie image[cropped].jpegw tym samym katalogu.

Scenariusz

#!/usr/bin/env python3
import subprocess
import sys

# image, crop- dimensions
img = sys.argv[1]; left = sys.argv[2]; right = sys.argv[3]; top = sys.argv[4]; bottom = sys.argv[5]
# arrange the output file's name and path
img_base = img[:img.rfind(".")]; extension = img[img.rfind("."):]; path = img[:img.rfind("/")]
img_out = img_base+"[cropped]"+extension
# get the current img' size
data = subprocess.check_output(["identify", img]).decode("utf-8").strip().replace(img, "")
size = [int(n) for n in data.replace(img, "").split()[1].split("x")]
# calculate the command to resize
w = str(size[0]-int(left)-int(right)); h = str(size[1]-int(top)-int(bottom)); x = left; y = top
# execute the command
cmd = ["convert", img, "-crop", w+"x"+h+"+"+x+"+"+y, "+repage", img_out]
subprocess.Popen(cmd)

Jak używać

  1. Używa skryptu imagemagick

    sudo apt-get install imagemagick
    
  2. Zapisz powyższy skrypt jako crop_image(bez rozszerzenia) w ~/bin.

  3. Utwórz katalog, jeśli to konieczne. W takim przypadku uruchom także, source ~/.profileaby katalog się pojawił $PATH.
  4. Spraw, by skrypt był wykonywalny.

Teraz wystarczy uruchomić skrypt według jego nazwy, jak wspomniano, np .:

crop_image /path/to/image.jpg 20 30 40 50

Spacje nie stanowią problemu, o ile w takim przypadku używasz cudzysłowów:

crop_image '/path/with spaces in the name/to/image.jpg' 20 30 40 50
Jacob Vlijm
źródło
@Maythux Nie wiesz, co oznacza Twoja ostatnia edycja, masz na myśli powyższe rozwiązanie, które nie działa w twoim systemie? To tylko cli.
Jacob Vlijm
Przepraszam, że nie było mnie trzy dni temu, więc nie wiem, dlaczego dostajesz głos negatywny, zamiast tego tutaj moja +1, ponieważ zasługujesz.
Maythux,
Ale myślę, że nawet to działa, byłoby to trochę trudniejsze dla początkującego niż używanie rodzimego narzędzia do przycinania, ale dla mnie kocham twoją drogę, całkiem fajnie, przepraszam za opóźnienie
Maythux
Wow, dzięki. Opinia, którą otrzymałem z tego powodu: meta.askubuntu.com/questions/14082/…
Jacob Vlijm
Nie wiem, dlaczego dobra odpowiedź / pytanie jest odrzucane, chyba że złe użycie reputacji, to pytanie dostaje -3 !!! hhhh Nie rozumiem dlaczego
Maythux
3

Możesz użyć polecenia konwersji w image magickpakiecie.
Aby zainstalować sudo apt-get install imagemagicklub sudo yum install ImageMagick.
Następnie użyj -crop geometrydo przycięcia obrazu. Więcej odczytów przeczytasz tutaj

M. Fooladgar
źródło
Ta uprawa według stosunku, a nie z różnymi marginesami
Maythux
Nie, -cropopcja daje xi yTo są przesunięcia i gravity. więc możesz użyć go do czasu przycięcia kwadratu
M.Fooladgar
Wysłałem to jako odpowiedź, dziękuję za twoją pomoc, ale powinieneś napisać to w swojej odpowiedzi przed4
Maythux
@Arronical Thanks Już to rozumiem i opublikowałem jako odpowiedź. sprawdź to
Maythux,
3

Zastosowanie mogrify -crop <W>x<H>+<X>+<Y> <files>.

Ostrożnie: pliki są zastępowane bez powiadomienia.

R2-D2
źródło
1

cropKomenda potrzebuje 4 rzeczy. Aby to zrozumieć, weź zdjęcie, które chcesz przyciąć. Teraz wyobraź sobie, że na obrazie rysujesz prostokąt o rozmiarze, który chcesz zachować. Obszar poza tym prostokątem zostanie wyeliminowany, przycięty. Prostokąt nie może być przechylany, tzn. Górna strona musi być pozioma.

Teraz zanotuj te 4 rzeczy:

  1. szerokość (W) w pikselu prostokąta
  2. wysokość (H) prostokąta
  3. odległość lewej pionowej strony prostokąta od lewego marginesu / końca (L) obrazu
  4. odległość górnej strony prostokąta od górnego marginesu / końca obrazu (T).

Zatem masz teraz wartości W, H, L i T. Jak na razie dobrze. Aby poznać piksele, możesz zainstalować narzędzie krule w Ubuntu. Bardzo przydatne.

Teraz otwórz terminal i przejdź do folderu, w którym jest przechowywany obraz. Użyj następującego polecenia i poprawnie wprowadź wartości W, H, L i T:

convert input.jpg -crop WxH+L+T output.jpg
Googly Googly
źródło