Please enable java script to visit.
NOTEBOOK
HOMEPHP / MySQLJS / HTMLWXappPythonC++Blender其他
Ubuntu 图像处理命令 Imagemagick - NOTEBOOK
Ubuntu 图像处理命令 Imagemagick
PHP / MySQL其他
Posted on 2022-12-24
摘要 : 在php 中使用图像处理命令 Imagemagick
先来看看 ImageMagick 能做些什么:
1、批量旋转、分割,并顺序编号
2、自动批量切除白边(auto-crop)
3、自动倾斜校正(deskew)
4、批量加标注
5、批量去标注
6、批量加水印
7、批量去水印
❱ 安装Imagemagick运行以下命令来安装imagemagick

sudo apt install imagemagick


安装php 的 Imagemagick扩展:不推荐。直接用系统命令行操作更有效率。
sudo apt-get install php-imagick


❱ 安装免费中文字体

// 中文字体安装:思源
sudo apt-get install -y fonts-noto-cjk

// 然后就可以使用中文字体 : Noto-Sans-CJK-SC-Regular
// 其他免费中文字体
sudo apt-get install ttf-wqy-microhei #文泉驿-微米黑
sudo apt-get install ttf-wqy-zenhei #文泉驿-正黑
sudo apt-get install xfonts-wqy #文泉驿-点阵宋体


❱ 通过命令查看支持的字体

convert -list font
magick -list font


❱ 在一个图片上添加一个文字。(例如添加货号)

// 1.jpg原始为 200x400,保存为11.jpg。添加一行文字。
// 在一个图片的底部添加 30px的白底,并加上文字。
convert 1.jpg -background '#fff' -gravity north -extent 200x430 -fill black -font Noto-Sans-CJK-SC-Regular -pointsize 18 -gravity south -draw 'text 0,20 "Water Mark and something"' 11.jpg
text 0,20 : 位置。(从基准点开始算)

// 1.jpg原始为 200x400,保存为11.jpg。添加两行文字。
convert 1.jpg -background '#fff' -gravity north -extent 996x1100 -fill black -font Noto-Sans-CJK-SC-Regular -pointsize 18 -gravity south -draw 'text 0,20 "Water Mark and something"' -draw 'text -200,40 "Other things"' 11.jpg


❱ 批量在一个文件夹中给多个jpg文件添加同一个文字水印

mogrify -font Arial -pointsize 24 -fill black -gravity south -weight bolder -annotate +20+100 "Water Mark and something" /var/www/html/0000/*.jpg
-annotate +20+100 :代表位置(从基准点开始算)
-gravity south :代表基准点在南边中间
*.jpg :代表所有jpg文件
-weight bolder :代表粗体(可选)
-fill black :填充颜色
-pointsize 24 :字体大小
-font Arial :字体





❱ ImageMagick 能做些什么


❱ 最基本的格式转换

将 a.gif 转为 png 格式
convert a.gif a.png

请注意,convert 命令的基本格式为
convert 源文件 [参数] 目标文件
在上面的命令中,源文件是 a.gif,目标文件是 a.png。由于这是最简单的格式转换,所以不需要中间的参数。
convert 常用于单个文件的转换。上面的命令是它最基本的用法。
可以使用-quality参数。参数的数值在0至100之间,数值越大文件越大,通 常情况下,60-80就可以了
convert -quality 80 filename.bmp filename.jpg
convert -quality 100 -density 300 file.pdf image.jpg


IM 支持超过 100 种的文件格式。
下面的命令,可以列出 IM 所支持的所有格式:
identify -list format


❱ 通过"resize 1800"参数即可设置输出图片的宽度为1800像素,清晰度高了很多。

convert -verbose -colorspace RGB -resize 1800 -interlace none -density 300 -quality 100 XXX.pdf XXX.jpg

如果无法转换 pdf ,那要做以下修改:
sudo nano /etc/ImageMagick-6/policy.xml

<policy domain="coder" rights="none" pattern="PDF" />
修改成
<policy domain="coder" rights="read|write" pattern="PDF" />


批量将图片合并为PDF
convert "*.{png,jpeg,jpg}" -quality 100 outfile.pdf


将一张宽高为 900x600 的图片 goods.jpg 生成宽高为 150x100 的缩略图 thumbnail.jpg
convert -resize 150x100 -quality 70 -strip goods.jpg thumbnail.jpg

!:不管图片宽高如何,都缩放成 150x100 这样的尺寸。
>:只有宽高均大于 150x100 的图片才缩放成该尺寸 ( 按比例取最大值 ),小于的图片不做处理。
<:与 > 功能相反。
convert -resize '150x100!' goods.jpg thumbnail.jpg
convert -resize '150x100>' goods.jpg thumbnail.jpg
convert -resize '150x100<' goods.jpg thumbnail.jpg




❱ 添加水印

给图片居中加上透明文本水印。
convert -draw 'text 0,0 "JD.COM"' -fill 'rgba(221, 34, 17, 0.25)' -pointsize 36 -font 'cochin.ttc' -gravity center joy.jpg watermark.jpg

-draw:绘图选项,text 声明绘制文本, 0,0 声明文本距离图片左上角的偏移值, JD.COM 声明绘制的文本,最好用引号包裹起来,避免输入特殊字符引起错误。绘制文本的格式为 text x,y string,当然还可以绘制其他类型,诸如圆 ( circle )、折线 ( polyline )。
-fill:对文本填充颜色,貌似 ImageMagick 命令中前面的选项是用来控制后面的选项的,所以应该把这样的修饰选项放到 -draw 前面比较好,很重要,后面的案例就是这样的。
-pointsize:指定文本的字体大小。
-font:指定字体。
-gravity:设置文本在图片里的排列方式 ( 类似 CSS 里的 align-items + justify-content ),center 表示水平垂直都居中,其他值还可以是:NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast,不记大小写。
-fill 代表填充颜色,可以通过RGB方式调整颜色
-fill blue
-fill "#ddddff"
-fill "rgb(255,255,255)"
-fill rgba(125, 125, 125, 1)" #最后一个是透明度

通过命令magick -list font查看支持的字体
convert -list font


❱ 给条码图片添加货号。
1.jpg 原始为 200x400
// 扩大画布
convert 1.jpg -background white -gravity north -extent 200x430 2.jpg
// 添加文字:
convert -draw 'text 0,0 "货号货号"' -fill 'rgba(125, 125, 125, 1)' -font Arial -pointsize 18 -gravity south 44.jpg 55.jpg
// 添加多行文字,用 斜杠 \ 来换行。
convert -draw 'text 0,0 "货号货号 \ 产品信息"' -fill 'rgba(125, 125, 125, 1)' -font Arial -pointsize 18 -gravity south 44.jpg 55.jpg



❱ 定义输出文件名

上面默认输出的文件名为:frame-0.jpg, frame-1.jpg, frame-2.jpg ...,
如果想使用下划线作为符号,输出为 frame_0.jpg, frame_1.jpg, frame_2.jpg ...,则可以如下设置。
convert -coalesce rain.gif frame_%d.jpg
// 或者
convert -coalesce -set filename:n '%p' rain.gif 'frame_%[filename:n].jpg'



❱ 批量文件的格式转换

批量的操作代码有一点不一样。
mogrify -path newdir -format png  *.gif

这个命令的作用,是将当前目录下的所有 gif 文件,转换为 png 格式,并将其存放在 newdir 目录下。
mogrify 是用于批量处理文件的命令。它的基本格式是这样的:
mogrify 参数 源文件

mogrify 支持基本的通配符,例如你可以用 a*.png 指代所有以 a 打头的 png 文件,诸如此类。
再回到刚才的命令:
mogrify -path newdir -format png  *.gif

这里的 -path 和 -format 是两个可选择的参数。
-format 指定输出的文件格式,而 -path 则指定输出的文件目录。
我在这里先强调一下:如果不加 -path 参数的话,mogrify 有可能会覆盖你的源文件,因此强烈推荐在每个 mogrify 命令里都加上 -path 参数,并在执行之前,先检查整个命令正确性。


❱ 图像的缩放

图像的缩放:使用 -resize (按比例缩放)
IM 有好几种缩放图像的方法,在这里我只讲最基本的 resize 命令。
// 将一个200x304大小的图像缩小为100x152(长宽各缩短一半)
convert page200.png -resize 100x152 page100.png
// 上面的 100x152,指定了目标文件的长和宽。

// 你也可以只指定目标文件宽度,这样它的高度会等比例放大:
convert page200.png -resize 100 page100.png
// 或者只指定高度:
convert page200.png -resize x152 page100.png

以上三句命令,其结果都是一样的。
你可以用 identify 命令来显示图像的尺寸以及其它一些信息:
identify page100.png

其结果为:
page100.png PNG 100x152 100x152+0+0 8-bit DirectClass 17.9kb
最后,你还可以通过指定百分比来缩放图像:
convert page200.png -resize 50% page100.png
convert page200.png -resize 150% page300.png

批量缩放图像
mogrify -path newdir -resize 200% *.png

这句命令的意思是将当前目录中所有的 png 文件都放大一倍,并存放到 newdir 目录中。


❱ 图像的剪切

❱ 使用 -crop

convert page100.png -crop 50x50+10+10 crop1.png
convert page100.png -crop 50x50+10+10 +repage crop2.png

这两句命令的意思都是以 10,10 为原点,从图上剪一个 50x50 的小图。
+repage 的作用是重置图像内部的信息。
下面是用 identify 命令查看 crop1.png 和 crop2.png 的结果。
crop1.png PNG 50x50 100x152+10+10 8-bit DirectClass 4.6kb
crop2.png PNG 50x50 50x50+0+0 8-bit DirectClass 4.56kb

除非特殊情况,不然每次使用 -crop 类语句时,都应加上 +repage。

❱ -gravity 语句

在缺省情况下,原点坐标设在图像的左上角,也就是所谓的 NorthWest。你可以用 -gravity 语句来改变坐标的方向。
convert page100.png -gravity west -crop 50x50+0+0 +repage crop3.png
convert page100.png -gravity east -crop 50x50+0+0 +repage crop4.png

-gravity 的参数包括 NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast。大小写都行。


❱ 将一张图切成2张图:

下面的命令在扫描图书时经常会用到:
convert 2pages.png -crop 50%x100% +repage newpage.png

系统自动会生成 newpage-0.png 和 newpage-2.png 两个文件。
请注意,在 -crop 后面跟的是 50%x100%,而不是 50%x100%+0+0。
这句话的意思,是让它按 50%x100% 这样的大小,一块块切下去,能切几块就切几块。
如果你设的是 50%x50%,那它就会切成 4 块。
❱ 批量处理:

convert page*.png -crop 50%x100% +repage newpaged.png
请注意这里的 d。这条命令能自动产生 newpage001.png newpage002.png newpage003.png ……这样的文件。页码顺序不乱。



❱ -trim 自动切除白边

convert page100.png -trim +repage trim.png


❱ 旋转与校正

❱ -rotate

convert r90.png -rotate -90 page200.png
批量旋转:
mogrify -path newdir -rotate -90 *.png
结合以前讲的 -rotate 命令,旋转分割一步到位。
convert r2pages.png -rotate -90 -crop 50%x100% +repage newpage.png
-background 命令
convert page200.png -background blue -rotate 10 r10.png
用 -background 设定背景的颜色,有时会用得到。


❱ 这个命令列出所有可直接使用的颜色英文名。

convert -list color

IM 支持许多种表示颜色的方法(其它的以后再讲),直接用英文名(如 black, white, red, blue 等)是最方便的。

❱ -deskew

-deskew 命令用于自动倾斜校正。后面跟一个百分数,手册上推荐你用 40% 这个值(A threshold of 40% works for most images)。
convert page100.png -background white -deskew 40% deskewed.png

❱ 批量校正:

mogrify -path newdir -background white -deskew 40% *.png






重要:
https://aotu.io/notes/2018/06/06/ImageMagick_intro/index.html


参考文档:
http://www.imagemagick.org/script/index.php
http://www.lao8.org/article_1697/ImageMagick.html#shuo
加水印
http://www.fmwconcepts.com/misc_tests/perceptual_hash_test_results_510/index.html
https://www.shuzhiduo.com/A/6pdDplAldw/