Domanda

Ho bisogno di ritagliare una serie di immagini jpeg Formatta per 20 pixel sul lato destro perdita senza perdite su Linux.

Ho controllato jpegtran, ma ha bisogno della dimensione del file nei pixel prima di ritagliare e non so come creare un file batch con quello.

Come posso ritagliare senza perdita di 20 pixel dal lato destro delle immagini a livello di programmazione?

È stato utile?

Soluzione

Il mio scripting di shell è un po 'arrugginito, quindi per favore fai un backup delle tue immagini prima di provare questo 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

Punti da notare:

  • Regola il percorso al valore corretto
  • Hai bisogno di *.jpeg?
  • identify è un comando ImageMagick
  • awk afferrerà le dimensioni dei pixel da identify da utilizzare come parametro (con la larghezza ridotta di 20px) per jpegtran Per ritagliare l'immagine
  • La nuova immagine viene salvata come new_[old_name].jpg
  • jpegtran potrebbe regolare la regione di ritaglio in modo che possa funzionare senza perdita. Verificare che le immagini risultanti siano le dimensioni corrette e non leggermente più grandi.

Altri suggerimenti

Molto simile alla risposta accettata, i seguenti funzionerebbero anche con nomi di file contenenti spazi. Ed è probabilmente più semplice, usando identifyè integrato -format opzione Invece di analizzare l'output 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top