仅使用命令行工具裁剪图像

仅使用命令行工具裁剪图像

我想使用裁剪图像仅限命令行工具指示四个方向要裁剪的像素(与我们在 LibreOffice 中裁剪的方式相同)

例如:

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

是否有这样的工具(非 GUI)?

答案1

convert这是使用图像魔法包的解决方法。

sudo apt-get install imagemagick

对于图片image.jpg

$ identify image.jpg 

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

如上图,输入图像为720x482px。

现在要进行裁剪,你必须确定两个因素:

  1. 裁剪的起点(包含 2 个方向)
  2. 裁剪后的矩形尺寸(这里可以包括其他方向)

现在回到上面的图片image.jpg,我想要裁剪:

  • 顶部 5px
  • 底部 7px
  • 右 14px
  • 左 3px

width那么您可以使用( x height++ / x ++格式)left来完成:topwhlt

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

现在

$ identify output.jpg 

output.jpg JPEG 703x470 703x470+0+0 8-bit DirectClass 102KB 0.000u 0:00.000

答案2

如果要修剪白色区域,imagemagick可以使用特殊命令:

convert -trim input.jpg output.jpg

答案3

要创建“用户友好”的 cli- 选项,可以使用以下脚本。只需运行以下命令:

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

它会创建一个裁剪的图像,并在同一目录中image.jpeg命名。image[cropped].jpeg

剧本

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

如何使用

  1. 该脚本使用imagemagick

    sudo apt-get install imagemagick
    
  2. 将上述脚本另存为crop_image(无扩展名)~/bin

  3. 如果需要,请创建目录。在这种情况下,还要运行source ~/.profile以使目录显示在 中$PATH
  4. 使脚本可执行。

现在只需按其名称运行脚本,如上所述,例如:

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

空格没有问题,只要在这种情况下使用引号:

crop_image '/path/with spaces in the name/to/image.jpg' 20 30 40 50

答案4

使用mogrify -crop <W>x<H>+<X>+<Y> <files>

小心:文件覆盖恕不另行通知。-path如果需要,请添加指定输出目录的选项以防止这种情况发生。

例如:mogrify -crop 256x256+10+5 images/*.jpg将文件夹中的每个图像images从顶部开始裁剪 10 个像素,从侧面开始裁剪 5 个像素,将其裁剪为 256x256 图像。它将覆盖旧图像。

Argument list too long如果由于尝试一次转换多个图像而出现错误,只需将图像路径括在单引号中以防止 bash 扩展它: mogrify -crop 256x256+10+5 'images/*.jpg'(mogrify 将自行进行扩展)

相关内容