Cortando imagens usando apenas ferramentas de linha de comando

34

Eu quero cortar uma imagem na minha CLI apenas no Ubuntu usando a ferramenta de linha de comando indicando apenas pixels para cortar nas quatro direções. (igual ao encontrado no libreoffice)

Por exemplo:

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

Existe essa ferramenta (não GUI)?

Maythux
fonte
possível duplicação de Existe uma ferramenta leve para cortar imagens rapidamente?
Thomas Weller
@ThomasWeller isso é pedir para a linha de comando e ferramenta não GUI mais a questão ligada você forneceu é de cerca de GUI por isso, basta ler a pergunta novamente
Maythux
2
A pergunta vinculada não especifica o tipo de ferramenta. A segunda resposta é sobre uma ferramenta de linha de comando: imagemagick. Eu sei que há discussões sobre SO, se uma pergunta é duplicada, caso a resposta seja a mesma. As pessoas podem concordar ou discordar.
Thomas Weller
1
@ Thomashoeller, mas a resposta não é conveniente, além disso, não mostra como e por que ele usou as opções. Francamente, você entendeu as opções usadas ?! Eu mesmo não pode obter essa informação, é apenas a primeira resposta aqui, é sem nenhuma explicação que torna a qualidade resposta baixo
Maythux
@downvoters Devo saber qual é o seu problema? !!
Maythux

Respostas:

38

Aqui está uma solução alternativa usando o convertpacote de imagens mágicas.

sudo apt-get install imagemagick

Para uma foto image.jpg

$ identify image.jpg 

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

Como mostrado acima, a imagem de entrada é 720x482px.

Agora, para fazer o corte, é necessário determinar dois fatores:

  1. ponto de partida do corte (inclui 2 direções)
  2. O tamanho do retângulo cortado (aqui você pode incluir as outras direções)

Agora, de volta à imagem image.jpgacima, quero recortar:

  • top 5px
  • 7px inferior
  • 14px certo
  • 3px esquerdo

então você poderia fazê-lo com (formato widthx height+ left+ top/ wx h+ l+ t):

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

Agora

$ identify output.jpg 

output.jpg JPEG 703x470 703x470+0+0 8-bit DirectClass 102KB 0.000u 0:00.000
Maythux
fonte
2
Dizem que o Imagemagick 7 usa o comando "magick" no lugar de "convert". Se alguém correr para command not found: convertproblema, tentemagick
iplus26
1
Foi uma grande ajuda, mas demorei um pouco para entender os "cálculos". Eu tinha um conjunto de imagens de 1280x1024 de que precisava para cortar a parte superior e inferior, para que a imagem final tivesse os 718 pixels "médios" do original (tirando uma faixa preta em cima e em baixo). Eu precisava usar isso: convert in.png -crop 1280x718+0+152 out.pngonde eu entendo essa linha como convert in.png -crop [final-right-x]x[final-right-y]+[crop-left]+[crop-top] out.png:, embora isso não pareça coincidir com os números do @ Maythux ... FWIW!
21418
3
Não deveria ser em 703x470vez de 713x470? Como o corte esquerdo + direito = 3+14 = 17px, quando subtraído de 720é 703, e não 713.
Mooncrater
Isso ajudou! Também sugeri uma edição para corrigir os 703px, em vez dos 713px (com os quais concordo), e invertida para a esquerda e a parte superior no formatoWxH+l+t
el-teedee
12

Se você deseja aparar regiões brancas, imagemagickexiste um comando especial para isso:

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

Para criar uma opção "amigável ao usuário", o script abaixo pode ser usado. Basta executar o comando:

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

Ele cria uma imagem cortada de image.jpeg, nomeada image[cropped].jpegno mesmo diretório.

O script

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

Como usar

  1. O script usa imagemagick

    sudo apt-get install imagemagick
    
  2. Salve o script acima como crop_image(sem extensão) em ~/bin.

  3. Crie o diretório, se necessário. Nesse caso, também execute source ~/.profilepara fazer com que o diretório seja exibido $PATH.
  4. Torne o script executável.

Agora basta executar o script pelo nome, como mencionado, por exemplo:

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

Espaços não são problema, desde que nesse caso, você use aspas:

crop_image '/path/with spaces in the name/to/image.jpg' 20 30 40 50
Jacob Vlijm
fonte
@ Maythux Não sabe ao certo o que significa sua edição mais recente, você quer dizer que a solução acima não funciona no seu sistema? É apenas cli.
Jacob Vlijm
Sinto muito por ter saído há três dias, então não sei por que você recebeu um voto negativo. Em vez disso, aqui está o meu +1, pois você merece.
Maythux 8/06/15
Mas acho que ainda funciona isso seria muito mais difícil para um novato um pouco do que usando uma ferramenta de culturas nativas, mas para mim eu adoro seu jeito, muito legal, desculpe novamente por atraso
Maythux
Uau, obrigada. O voto negativo
Jacob Vlijm
Eu não sei por que uma boa resposta / pergunta é rebaixada, a menos que um mau uso da reputação, esta pergunta tenha -3 !!! hhhh eu não entendo o porquê
Maythux 8/15
3

Você pode usar o comando convert no image magickpacote.
Para instalar sudo apt-get install imagemagickou sudo yum install ImageMagick.
Em seguida, use -crop geometrypara cortar a imagem. Para mais leituras, leia aqui

M.Fooladgar
fonte
Esta cultura por proporção e não com margens diferentes
Maythux 03/06
Não, -cropopção dá xe yIsso são compensações e gravity. assim você pode usá-lo para o tempo para cortar um quadrado
M.Fooladgar
Eu postei como resposta, obrigado pela ajuda de qualquer maneira, mas você deve escrevê-lo na sua resposta antes4
Maythux
@ Obrigado Arronical Eu já entendi e postou como resposta. por favor verifique-o
Maythux
3

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

Cuidado: os arquivos são substituídos sem aviso prévio.

R2-D2
fonte
1

O cropcomando precisa de 4 coisas. Para entender, pegue a imagem que deseja cortar. Agora, imagine que na imagem você está desenhando um retângulo do tamanho que deseja reter. A área fora desse retângulo será eliminada e cortada. O retângulo não deve ser inclinado, ou seja, o lado superior deve estar na horizontal.

Agora, anote estas 4 coisas:

  1. a largura (W) em pixel do retângulo
  2. altura (H) do retângulo
  3. distância do lado vertical esquerdo do retângulo a partir da margem esquerda / extremidade (L) da imagem
  4. distância do lado superior do retângulo à margem / final superior da imagem (T).

Assim, você tem agora os valores W, H, L e T. Por enquanto, tudo bem. Para conhecer os pixels, você pode instalar a ferramenta krule no Ubuntu. Muito útil.

Agora, abra o terminal e vá para a pasta onde a imagem está armazenada. Use o seguinte comando e coloque os valores de W, H, L e T corretamente:

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