1

I need to crop a number of images in jpeg format by 20 pixels on the right side losslessly on Linux.

I checked jpegtran, but it needs the file size in pixels before cropping, and I don't know how to build a batch file with that.

How can I losslessly crop 20 pixels from the right side of images programmatically?

4

2 回答 2

2

我的 shell 脚本有点生疏,所以请在尝试此脚本之前备份您的图像。

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

注意事项:

  • 将路径调整为正确的值
  • 您需要 *.jpeg 吗?
  • identify是一个 ImageMagick 命令
  • awk将从中获取像素尺寸identify以用作参数(宽度减少 20px)jpegtran以裁剪图像
  • 新图像另存为new_[old_name].jpg
  • jpegtran可能会调整裁剪区域,使其可以无损执行。检查生成的图像尺寸是否正确,而不是稍大一些。
于 2013-11-08T00:28:03.900 回答
2

与接受的答案非常相似,以下内容也适用于包含空格的文件名。它可以说更简单,使用identify的内置-format选项而不是使用 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
于 2020-11-17T09:37:40.697 回答