Recorte de imágenes usando solo herramientas de línea de comandos

34

Quiero recortar una imagen en mi CLI solo Ubuntu usando la herramienta de línea de comandos que solo indica píxeles para recortar en las cuatro direcciones. (igual que el que se encuentra en libreoffice)

Por ejemplo:

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

¿Existe tal herramienta (no GUI)?

Maythux
fuente
@ThomasWeller esto está pidiendo una línea de comando y no una herramienta GUI, más la pregunta vinculada que proporcionó es sobre GUI, así que simplemente lea la pregunta nuevamente
Maythux
2
La pregunta vinculada no especifica el tipo de herramienta. La segunda respuesta es sobre una herramienta de línea de comando: imagemagick. Sé que hay discusiones sobre SO si una pregunta es un duplicado en caso de que la respuesta sea la misma. Las personas pueden estar de acuerdo o en desacuerdo.
Thomas Weller
1
@ThomasWeller, pero la respuesta no es conveniente, además no muestra cómo y por qué usó las opciones ... ¿Francamente entendiste las opciones utilizadas? Yo mismo no puedo obtener esa información, es solo la primera respuesta aquí, no tiene explicación, lo que hace que la respuesta sea de baja calidad
Maythux
@downvoters ¿¡Debo saber cuál es el problema contigo !!
Maythux

Respuestas:

38

Aquí hay una solución alternativa usando el convertpaquete de imágenes mágicas.

sudo apt-get install imagemagick

Para una foto image.jpg

$ identify image.jpg 

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

Como se muestra arriba, la imagen de entrada es 720x482px.

Ahora para hacer el recorte tienes que determinar dos factores:

  1. punto de partida del cultivo (incluye 2 direcciones)
  2. El tamaño del rectángulo recortado (aquí puede incluir las otras direcciones)

Ahora volviendo a la imagen de image.jpgarriba, quiero recortar:

  • top 5px
  • inferior 7px
  • derecha 14px
  • izquierda 3px

entonces podrías hacerlo con ( formato widthx height+ left+ top/ wx h+ l+ t):

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

Ahora

$ identify output.jpg 

output.jpg JPEG 703x470 703x470+0+0 8-bit DirectClass 102KB 0.000u 0:00.000
Maythux
fuente
2
Se dice que Imagemagick 7 usa el comando "magick" en lugar de "convertir". Si alguien tiene command not found: convertproblemas, intentemagick
iplus26
1
Esto fue de gran ayuda, pero me llevó un tiempo comprender los "cálculos". Tenía un conjunto de imágenes de 1280x1024 de las que necesitaba recortar arriba y abajo, por lo que la imagen final tendría los 718 píxeles "medios" del original (quitando una banda negra arriba y abajo). Necesitaba usar esto: convert in.png -crop 1280x718+0+152 out.pngdonde entiendo que esa línea significa: convert in.png -crop [final-right-x]x[final-right-y]+[crop-left]+[crop-top] out.pngaunque eso no parece coincidir con los números de @ Maythux ... ¡FWIW!
Dɑvïd
3
¿No debería ser en 703x470lugar de 713x470? Como el recorte izquierdo + derecho = 3+14 = 17px, que cuando se resta de 720es 703, y no 713.
Mooncrater
Esto ayudó! También sugerí una edición para ARREGLAR tanto 703px en lugar de 713px (que estoy de acuerdo), e invertido en formato izquierdo y superiorWxH+l+t
el-teedee
12

Si desea recortar regiones blancas, imagemagicktiene un comando especial para ello:

convert -trim input.jpg output.jpg
Martin Thoma
fuente
9

Para crear una opción cli "amigable para el usuario", se puede usar el siguiente script. Simplemente ejecute el comando:

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

Crea una imagen recortada de image.jpeg, nombrada image[cropped].jpegen el mismo directorio.

La secuencia de comandos

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

Cómo utilizar

  1. El script usa imagemagick

    sudo apt-get install imagemagick
    
  2. Guarde el script anterior como crop_image(sin extensión) en ~/bin.

  3. Cree el directorio si es necesario. En ese caso, ejecute también source ~/.profilepara que aparezca el directorio $PATH.
  4. Haga que el script sea ejecutable.

Ahora simplemente ejecute el script por su nombre, como se mencionó, por ejemplo:

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

Los espacios no son un problema, siempre y cuando en ese caso, utilice comillas:

crop_image '/path/with spaces in the name/to/image.jpg' 20 30 40 50
Jacob Vlijm
fuente
@Maythux ¿No está seguro de lo que significa su última edición, quiere decir que la solución anterior no funciona en su sistema? Es solo cli.
Jacob Vlijm
Lo siento, estuve fuera hace tres días, así que no sé por qué recibes un voto negativo, en cambio, aquí mi +1 ya que te lo mereces.
Maythux
Pero creo que incluso funciona esto sería bastante difícil para un novato un poco que el uso de una herramienta de recorte nativa, pero para mí Me encanta su manera, muy bien, siento de nuevo en caso de retraso
Maythux
Wow gracias. El voto negativo
Jacob Vlijm
No sé por qué se rechaza una buena respuesta / pregunta a menos que se haga un mal uso de la reputación, ¡esta pregunta tiene un -3! hhhh no entiendo por qué
Maythux
3

Puede usar el comando convertir en el image magickpaquete.
Para instalar sudo apt-get install imagemagicko sudo yum install ImageMagick.
Luego use -crop geometrypara recortar la imagen. Para más lecturas lea aquí

M.Fooladgar
fuente
Este cultivo por proporción y no con márgenes diferentes
Maythux
No, la -cropopción da xy yeso son compensaciones y gravity. para que puedas usarlo a tiempo para recortar un cuadrado
M.Fooladgar
He publicado como respuesta, gracias por su ayuda de todos modos, pero se debería escribir que en su respuesta before4
Maythux
@Arronical Gracias Ya lo entiendo y publicado como respuesta. por favor
verifíquelo
3

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

Cuidado: los archivos se sobrescriben sin previo aviso.

R2-D2
fuente
1

los crop comando necesita 4 cosas. Para entenderlo, tome la imagen que desea recortar. Ahora, imagine que en la imagen, está dibujando un rectángulo del tamaño que desea retener. El área fuera de este rectángulo será eliminada, recortada. El rectángulo no debe estar inclinado, es decir, el lado superior debe ser horizontal.

Ahora, anota estas 4 cosas:

  1. el ancho (W) en píxeles del rectángulo
  2. altura (H) del rectángulo
  3. distancia del lado vertical izquierdo del rectángulo desde el margen / extremo izquierdo (L) de la imagen
  4. distancia del lado superior del rectángulo desde el margen superior / final de la imagen (T).

Por lo tanto, ahora tiene los valores W, H, L y T. Hasta aquí todo bien. Para conocer los píxeles, puede instalar la herramienta krule en Ubuntu. Muy útil.

Ahora, abra la terminal y vaya a la carpeta donde está almacenada la imagen. Use el siguiente comando y coloque los valores de W, H, L y T correctamente:

convert input.jpg -crop WxH+L+T output.jpg
Googly Googly
fuente