Recorte automático de imagens em lote, aplicar largura fixa e manter a proporção

3

Estou achando difícil encontrar uma solução para o que estou tentando fazer.

Simplificando, o uso dessas imagens é para uma loja on-line.

O processamento em lote do IrfanView usando as bordas de recorte do autio basicamente classifica o recorte. Preciso cortar o branco / preto ou qualquer borda uniforme existente nas imagens que estão sendo processadas.

Mas preciso manter a imagem em um quadrado perfeito. Como 300 x 300 pixels.

Assim, por exemplo, se a imagem que está sendo cortada tiver um foco longo, ela cortará o espaço / margem em branco até atingir a parte superior e inferior. Em seguida, apenas cortaria a esquerda e a direita até um ponto em que o tamanho da esquerda e da direita é igual ao comprimento. Quer removendo apenas uma quantidade parcial de espaço em branco (margem) - ou, se necessário, adicione algum espaço em branco (margem).

    
por StuyvesantBlue 01.01.2016 / 02:07

4 respostas

3

imagemagick tem a maravilhosa opção -trim . Lembro-me de usá-lo junto com -size há um ano em um monte de 4500 fotos para remover a borda monocromática vazia e manter apenas o produto. Lembro-me de colocar todas as imagens no diretório a e criar uma pasta vazia b ; então a partir do diretório a usando algo como

for i in *; do convert-im6.q16 $i -trim -resize 300 ../b/$i; done

Depois, esperei cerca de uma hora e tinha 4500 imagens em dir b com o fundo monocromático aparado e largura 300 pixels. O comando convert-im6.q16 pode ser nomeado de forma um pouco diferente em outros sistemas, como convert ou algo assim.

    
por 01.06.2017 / 10:54
1

Eu usei o IrfanView para realizar uma solução viável.

Usando a conversão em lote / Renomear do arquivo > > Eu simplesmente adiciono imagens à caixa de diálogo Arquivos de Entrada.

  1. Use as opções avançadas nas configurações de conversão em lote e clique em Avançado.

  2. Marque RESIZE e selecione SET NEW SIZE, em seguida, defina um ou ambos os lados para. Na altura / largura coloque o mesmo tamanho (eu uso 300px). O que isso fará é redimensionar a imagem para um ponto máximo desse tamanho. Então, será necessário o maior tamanho (dependendo se a imagem é retrato ou paisagem) - e isso fará com que 300px. E o outro lado será dimensionado proporcionalmente desde que você mantenha a proporção.

  3. O que você também quer fazer é o Smart Crop, no caso do IrfanView, ele é chamado de Borda de corte automática - você verá essa configuração à direita da caixa de diálogo RESIZE.

Antes de concluir, você quer ter certeza de que ele primeiro faz o recorte e, em seguida, o redimensionamento, caso contrário, você terá algo menor que 300px, porque se ele for redimensionado para 300px e depois for depois disso ... você pode imaginar o resultado.

  1. Portanto, no canto inferior direito, marque Ordem de processamento personalizada e clique em Alterar pedido. Mova as bordas de recorte automático para o topo. Clique em OK, clique em OK novamente e você estará pronto para converter. Clik Start Batch.

Isso não resolveu exatamente a minha pergunta exata, mas não importa, desde que eu consiga obter o maior lado de 300px e o recorte inteligente antes do redimensionamento. O resto eu posso realizar com CSS no meu html, o que pode realmente ser uma solução melhor.

    
por 02.01.2016 / 15:13
1

Supondo que suas imagens originais não têm uma borda preta ou branca real e você só quer evitar a criação de tal, você pode usar convert :

do Imagemagick
convert in.jpg -geometry 300x300^ -gravity center -crop 300x300+0+0 out.jpg

O cursor ( ^ ) garante que a imagem preenche a largura e a altura.

No entanto, somente o uso do parâmetro -geometry deixaria uma imagem com um dos lados muito grande, supondo que você não tenha material de origem quadrada. Então você precisa cortar em torno do centro para obter a resolução final da imagem. +0+0 garante que você não receba as partes cortadas como arquivos separados, pois você não precisa delas.

Se você realmente tiver bordas na imagem de origem, convém usar -trim logo após in.jpg .

    
por 04.05.2016 / 17:26
0

Meus requisitos eram um pouco diferentes em que eu estava querendo cortar pixels transparentes, mas pode ser funcionalmente o mesmo que remover uma borda? Talvez.

Nenhuma dessas respostas funcionou para mim. Depois de colocar a recompensa, continuei procurando e descobri que extent era a peça que faltava.

magick convert *.png -trim -background none -resize 300x300 -gravity center -extent 300x300 out/processed.png

Aqui está o detalhamento do que cada parâmetro faz, até onde eu entendi:

  • -trim : apare todos os pixels transparentes (esquerda, direita, superior, inferior)
  • -background none : mantenha a transparência para redimensionar (a ordem é importante!)
  • -resize 300x300 : faz o máximo de largura e altura 300. Não faz com que seja quadrado .
  • -gravity center : Centraliza a imagem (pode não ser necessário, pode funcionar tanto com redimensionamento quanto com extensão, não testou muito).
  • -extent 300x300 : redimensiona a tela , o que a torna quadrada novamente.

O que significa basicamente três etapas:

  1. Remover bordas transparentes
  2. Redimensione para que a largura / altura não seja superior a 300 pixels.
  3. Faça a largura e a altura de 300 pixels.
por 02.06.2017 / 16:11