Pregunta

Necesito recortar una serie de imágenes en jpeg Formateo por 20 píxeles en el lado derecho sin pérdida en Linux.

lo comprobé jpegtran, pero necesita el tamaño del archivo en píxeles antes de recortar, y no sé cómo construir un archivo por lotes con eso.

¿Cómo puedo recortar sin pérdida a 20 píxeles del lado derecho de las imágenes programáticamente?

¿Fue útil?

Solución

Mi scripting de shell es un poco oxidado, así que haga una copia de seguridad de sus imágenes antes de probar este script.

#!/bin/bash
FILES=/path/to/*.jpg

for f in $FILES
do
    identify $f | awk '{ split($3, f, "x"); f[1] -= 20; cl = sprintf("jpegtran -crop %dx%d+0+0 %s > new_%s", f[1], f[2], $1, $1); system(cl); }'
done

Puntos a tener en cuenta:

  • Ajuste la ruta al valor correcto
  • ¿Necesitas *.jpeg?
  • identify es un comando imageMagick
  • awk Agarrará las dimensiones del píxel de identify para usar como parámetro (con el ancho reducido por 20px) para jpegtran Para recortar la imagen
  • La nueva imagen se guarda como new_[old_name].jpg
  • jpegtran podría ajustar la región de cultivo para que pueda funcionar sin pérdidas. Compruebe que las imágenes resultantes son del tamaño correcto y no un poco más grandes.

Otros consejos

Muy similar a la respuesta aceptada, lo siguiente también funcionaría con nombres de archivos que contienen espacios. Y podría decirse que es más simple, usando identify'S incorporado -format opción en lugar de analizar la salida con AWK.

#!/bin/bash

X=0; Y=0   # offset from top left corner

for f in /path/to/*.jpg; do
    read -r W H < <(identify -format '%w %h' "$f") # get width and height
    (( W -= 20 ))                                  # substract 20 from width
    out="${f%%.jpg}-crop-20.jpg"                   # add "-crop-20" to filename
    jpegtran -crop ${W}x$H+$X+$Y "$f" > "$out"     # crop
done
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top