Ritaglio di immagini utilizzando solo gli strumenti della riga di comando


34

Voglio ritagliare un'immagine sulla mia CLI solo Ubuntu utilizzando lo strumento da riga di comando che indica solo i pixel da ritagliare per le quattro direzioni. (uguale a quello trovato in libreoffice)

Per esempio:

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

Esiste un tale strumento (non una GUI)?



@ThomasWeller questo richiede la riga di comando e non lo strumento GUI più la domanda collegata che hai fornito riguarda la GUI, quindi per favore leggi di nuovo la domanda
Maythux,

2
La domanda collegata non specifica il tipo di strumento. La seconda risposta riguarda uno strumento da riga di comando: imagemagick. So che ci sono discussioni su SO se una domanda è un duplicato nel caso in cui la risposta sia la stessa. Le persone possono essere d'accordo o in disaccordo.
Thomas Weller,

1
@ThomasWeller ma la risposta non è conveniente, inoltre non mostra come e perché abbia usato le opzioni .. Francamente hai capito le opzioni usate ?! Io stesso non riesco a ottenere queste informazioni, è solo la prima risposta qui, è senza spiegazioni che rendono la risposta di bassa qualità
Maythux

@downvoters Devo sapere qual è il problema con te? !!
Maythux,

Risposte:


38

Ecco una soluzione alternativa utilizzando convertdal pacchetto di immagini magick.

sudo apt-get install imagemagick

Per una foto image.jpg

$ identify image.jpg 

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

Come mostrato sopra, l'immagine in ingresso è 720x482px.

Ora per fare il ritaglio devi determinare due fattori:

  1. punto di partenza del ritaglio (include 2 direzioni)
  2. Le dimensioni del rettangolo ritagliato (qui puoi includere le altre direzioni)

Ora torniamo all'immagine qui image.jpgsopra, voglio ritagliare:

  • top 5px
  • fondo 7px
  • giusto 14px
  • lasciato 3px

allora potresti farlo con (formato widthx height+ left+ top/ wx h+ l+ t):

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

Adesso

$ identify output.jpg 

output.jpg JPEG 703x470 703x470+0+0 8-bit DirectClass 102KB 0.000u 0:00.000

2
Si dice che Imagemagick 7 usi il comando "magick" al posto di "convert". Se qualcuno incontra un command not found: convertproblema, provamagick
iplus26

1
Questo è stato di grande aiuto, ma mi ci è voluto un po 'per avvolgere la testa attorno ai "calcoli". Avevo una serie di immagini 1280x1024 di cui avevo bisogno per ritagliare la parte superiore e inferiore, quindi l'immagine finale avrebbe i "medi" 718 pixel dall'originale (togliendo una banda nera in alto e in basso). Avevo bisogno di usare questo: convert in.png -crop 1280x718+0+152 out.pngdove intendo quella linea significa convert in.png -crop [final-right-x]x[final-right-y]+[crop-left]+[crop-top] out.png:, anche se questo non sembra corrispondere ai numeri di @ Maythux ... FWIW!
Dɑvïd,

3
Non dovrebbe essere 703x470invece di 713x470? Come il ritaglio sinistro + destro = 3+14 = 17px, quello sottratto 720è 703e non 713.
Mooncrater

Questo ha aiutato! Ho anche suggerito una modifica a FIX sia 703px anziché 713px (che sono d'accordo), e invertito a sinistra e in alto in formatoWxH+l+t
el-teedee,

12

Se vuoi tagliare le regioni bianche, imagemagickha un comando speciale per questo:

convert -trim input.jpg output.jpg

9

Per creare un'opzione cli "user friendly", è possibile utilizzare lo script seguente. Basta eseguire il comando:

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

Crea un'immagine ritagliata di image.jpeg, denominata image[cropped].jpegnella stessa directory.

Il copione

#!/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)

Come usare

  1. Lo script usa imagemagick

    sudo apt-get install imagemagick
    
  2. Salvare lo script sopra come crop_image(nessuna estensione) in ~/bin.

  3. Creare la directory se necessario. In tal caso, eseguire anche source ~/.profileper visualizzare la directory $PATH.
  4. Rendi eseguibile lo script.

Ora esegui semplicemente lo script con il suo nome, come detto, ad esempio:

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

Gli spazi non sono un problema, purché in quel caso usi le virgolette:

crop_image '/path/with spaces in the name/to/image.jpg' 20 30 40 50

@Maythux Non sei sicuro del significato dell'ultima modifica, intendi che la soluzione sopra non funziona sul tuo sistema? È solo cli.
Jacob Vlijm,

Mi dispiace di essere stato fuori tre giorni fa, quindi non so perché hai ricevuto un downvote, invece qui il mio +1 da te meritato.
Maythux,

Ma penso che anche se funziona, sarebbe un po 'più difficile per un principiante un po' che usare uno strumento di ritaglio nativo, ma per me amo la tua strada, piuttosto fico, scusami di nuovo per il ritardo
Maythux

Wow grazie. Il downvote che ho ricevuto per questo motivo
Jacob Vlijm

Non so perché una buona risposta / domanda venga annullata se non per un cattivo uso della reputazione, questa domanda diventa -3 !!! hhhh non capisco perché
Maythux,

3

Puoi usare il comando convert nel image magickpacchetto.
Per installare sudo apt-get install imagemagicko sudo yum install ImageMagick.
Quindi utilizzare -crop geometryper ritagliare l'immagine. Per ulteriori letture leggi qui


Questo raccolto per rapporto e non con margini diversi
Maythux

No, l' -cropopzione dà xe yche sono offset e gravity. così puoi usarlo per ritagliare un quadrato
M.Fooladgar

L'ho pubblicato come risposta, grazie per l'aiuto comunque, ma dovresti scriverlo nella tua risposta prima del 4
Maythux,

@Arronical Grazie Ho già capito e pubblicato come risposta. per favore, controlla
Maythux,

3

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

Attenzione: i file vengono sovrascritti senza preavviso.


1

Il cropcomando ha bisogno di 4 cose. Per capirlo prendi l'immagine che vuoi ritagliare. Ora, immagina che sull'immagine, stai disegnando un rettangolo della dimensione che vuoi conservare. L'area esterna a questo rettangolo verrà eliminata, ritagliata. Il rettangolo non deve essere inclinato, ovvero il lato superiore deve essere orizzontale.

Ora, annota queste 4 cose:

  1. la larghezza (W) in pixel del rettangolo
  2. altezza (H) del rettangolo
  3. distanza del lato verticale sinistro del rettangolo dal margine / estremità sinistra (L) dell'immagine
  4. distanza del lato superiore del rettangolo dal margine superiore / fine dell'immagine (T).

Quindi ora hai i valori W, H, L e T. Fin qui tutto bene. Per conoscere i pixel, è possibile installare lo strumento krule in Ubuntu. Molto utile.

Ora, apri il terminale e vai alla cartella in cui è memorizzata l'immagine. Utilizzare il comando seguente e inserire correttamente i valori di W, H, L e T:

convert input.jpg -crop WxH+L+T output.jpg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.