画像を垂直に半分に一括分割し、出力ファイルに順番に番号を付けます。

画像を垂直に半分に一括分割し、出力ファイルに順番に番号を付けます。

001.jpg番号付きの本のスキャンコピーを含むフォルダがあります。092.jpg

スキャンは、本の2ページを一緒にスキャンします。私が望むのは、中間から垂直に2つの部分に分割し、001.jpgファイル名をから184.jpg。したがって、最初はsum001.jpgに分割されます。問題を回避するには、ターゲットファイルを別のディレクトリに書き込む必要があります。001.jpg002.jpg

Imagemagickがこれを行うことができることがわかりました。しかし、これらすべての画像を一括処理するには、それを管理するための別のツールが必要だと思います。

誰でもこの問題を解決するのに役立ちますか?

答え1

最新バージョンがある場合は、次のImageMagick方法でイメージをバッチ処理できます。magickこのコマンドをターゲットディレクトリで実行すると仮定するコマンドの例(したがって、元のjpgディレクトリは別のディレクトリにあります):

magick /path/to/*.jpg -scene 1 -crop 2x1@ +repage %03d.jpg

答え2

分割に必要なimagemagickコマンドラインはわかりませんが、ここでも問題ありません。すでにこれを行う方法を見つけたからです。GraphicsMagickここでも同じアイデアが適用されます。私が見つけたコマンドは次のとおりです。 ImageMagickラインは非常に混乱しています。

だから私がしたいことは次のとおりです。

#!/usr/bin/zsh
# this is a ZSH script. Would probably also work under bash, haven't tried.

targetdir=/home/Plato/newimgs

getwidth=gm identify -format '%w'


for number in {001..092}; do
  infile="${number}.jpg"
  width=$(getwidth) "${infile}"

  leftnum=$((number * 2))
  rightnum=$((leftnum + 1))

  gm convert \
    -crop "50%x100%+0+0" \
    "${infile}" \
    "${targetdir}/${(l:3::0:)leftnum}.jpg"
  gm convert \
    -crop "50%x100%+$((width / 2))+0" \
    "${infile}" \
    "${targetdir}/${(l:3::0:)rightnum}.jpg"  
done

答え3

imagemagickを使うconvert

#!/bin/bash

inputdir=/path/to/images
outputdir=$inputdir/out
mkdir -p "$outputdir"

cnt=0
for i in "$inputdir/"*.jpg; do
    if convert "$i" -crop 50%x100% "$outputdir/%d.tmp"; then
        printf -v fname '%03d.jpg' $((++cnt))
        mv "$outputdir/0.tmp" "$outputdir/$fname"
        printf -v fname '%03d.jpg' $((++cnt))
        mv "$outputdir/1.tmp" "$outputdir/$fname"
    else
        echo "failed to convert $i" >&2
        exit 1
    fi
done

出力ファイル名を直接指定する方法が見つかりませんでした。

関連情報