用magick自动去除漫画图片的白边

起因

今天下了本漫画,准备放到kindle上面,按这个教程生成了几个mobi文件后,发现图片似乎有点小。

仔细一看,每一页的空白区域都很大:

于是乎找了一下,发现各种工具只能切割指定区域的白边,但是这个漫画每张图的区域都不一样。。

发现方法

逛了一大圈,最后发现magick官网)有去除白边的功能,参考convert命令的-trim参数–fuzz参数,在尝试了几次后,发现可以用这个命令:

magick convert raw.jpg \
-define trim:edges=north,east,south,west \
-background white \
-fuzz 85% \
-trim \
o.jpg

raw.jpg就是原始图片,o.jpg就是生成图片,85%这个参数看具体了,太大会导致图片被切割成一个像素点。这个命令效果相当不错

另外经过测试,貌似windows下,magick不支持中文路径和文件名,所以文件名和文件夹名如果有中文,需要改掉

批量处理!

这里偷了个懒,直接用了msys2官网)自带的bash。(早知道学学powershell了)

新建一个脚本文件,比如run.sh,内容如下:

function crop {
magick convert "$1" -define trim:edges=north,east,south,west -background white -fuzz $2% -trim "$1-done.jpg"
size="$(wc -c $1-done.jpg | awk '{print $1}')"
echo $size
if [[ $size -gt 100000 ]] #如果文件小于100k,说明转换结果是个像素点,当转换失败来处理,这里大家看需求来改
    then
    rm "$1"
    mv "$1-done.jpg" "$1"
else
    rm "$1-done.jpg"
    return 0
fi
return 1
}

#要转换的文件夹
pic=( pic/**/*.jpg );
#如果只要一层目录,用下面这行
pic=( pic/*.jpg );

for file in "${pic[@]}"
do
    echo $file
    magick convert "$file" -define trim:edges=north,east,south,west -background white -fuzz 87% -trim "$file-done.jpg"
    size="$(wc -c $file-done.jpg | awk '{print $1}')"
    echo $size
    if [[ $(crop $file 87) -eq 1 ]] #先试试87%
        then
        rm "$file"
        mv "$file-done.jpg" "$file"
    else
        if [[ $(crop $file 86) -eq 1 ]] #失败就试试6%
            then
            rm "$file"
            mv "$file-done.jpg" "$file"
        else
            if [[ $(crop $file 85) -eq 1 ]] #还是失败最后试试85%
                then
                rm "$file"
                mv "$file-done.jpg" "$file"
            fi
        fi
    fi
    echo ok
done

跑起来

效果

切的很干净

其他用途

理论上适用于一切需要切边的操作了,都可以试试

6 Comments

  1. Microsoft Edge 110.0.1587.57 Microsoft Edge 110.0.1587.57 Windows 10 x64 Edition Windows 10 x64 Edition

    大佬,这个.sh文件咋用windows运行啊,查了半天,装git之类的,有点麻烦,就想问下有没有其他方便点的

      1. Microsoft Edge 110.0.1587.57 Microsoft Edge 110.0.1587.57 Windows 10 x64 Edition Windows 10 x64 Edition

        好的,非常感谢,我今天试一下
        还有这个
        #要转换的文件夹
        pic=( pic/**/.jpg );
        我想选择
        E:\dell\视频\漫画\shiyan
        其中的所有jpg(另外,wepb图片格式可以吗?)
        是否是这样的
        pic=( pic/E/dell/视频/漫画/
        .jpg );

发表评论

您的电子邮箱地址不会被公开。