ImageMagick 按背景颜色拆分图像
ImageMagick split image by background color
我有大图https://buildyourboard.pro/userboards/board-img/data/clipart.png
如何通过透明(或其他)背景将此图像分割成小图像?
图片不在网格中,所以代码应该找到图片中每张图片的位置
如果您 运行 此命令,它将 sc运行ch 所有像素到一个只有一个像素宽且具有图像原始高度的图像中。然后您会看到所有带有单词 none
的线对应于您可以在图像上绘制水平线而不与任何板背景相交的所有位置:
convert boards.png -resize 1x! txt: | more
# ImageMagick pixel enumeration: 1,4667,255,srgba
0,0: (0,0,0,0) #00000000 none
0,1: (0,0,0,0) #00000000 none
0,2: (0,0,0,0) #00000000 none
...
...
...
0,547: (0,0,0,0) #00000000 none
0,548: (0,0,0,0) #00000000 none
0,549: (0,0,0,0) #00000000 none
0,550: (0,0,0,0) #00000000 none
0,551: (0,0,0,0) #00000000 none
0,552: (0,0,0,0) #00000000 none
0,553: (0,0,0,0) #00000000 none
0,554: (0,0,0,0) #00000000 none
0,555: (39038,36633,35446,0) #988F8A00 srgba(152,143,138,0)
0,556: (38889,36248,34984,12) #978D8800 srgba(151,141,136,0.000183108)
0,557: (38348,35253,33873,75) #95898400 srgba(149,137,132,0.00114443)
0,558: (35061,31775,30664,98) #887C7700 srgba(136,124,119,0.00149538)
0,559: (33894,30508,29428,164) #84777301 srgba(132,119,115,0.00250248)
0,560: (34379,30968,29853,243) #86787401 srgba(134,120,116,0.00370794)
现在你可以看到它从水平线上没有东西到有东西的第一个地方是第 555 行。所以基本上,你想检测它从 none
到东西。
这很容易通过 awk
像这样完成:
convert boards.png -resize 1x! txt: | awk 'inside && /none/{inside=0;print;next} !inside && ! /none/{inside=1;print}'
# ImageMagick pixel enumeration: 1,4667,255,srgba
0,0: (0,0,0,0) #00000000 none
0,555: (39038,36633,35446,0) #988F8A00 srgba(152,143,138,0)
0,911: (0,0,0,0) #00000000 none
0,1082: (36701,34188,35001,0) #8F858800 srgba(143,133,136,0)
0,1433: (0,0,0,0) #00000000 none
0,1570: (33489,32153,32838,4) #827D8000 srgba(130,125,128,6.10361e-05)
0,1937: (0,0,0,0) #00000000 none
0,2135: (29884,28945,29339,4) #74717200 srgba(116,113,114,6.10361e-05)
0,2486: (0,0,0,0) #00000000 none
0,2621: (28668,27300,25241,5) #706A6200 srgba(112,106,98,7.62951e-05)
0,2972: (0,0,0,0) #00000000 none
0,3216: (35066,32529,28581,2) #887F6F00 srgba(136,127,111,3.0518e-05)
0,3612: (0,0,0,0) #00000000 none
所以,现在我们知道我们可以在第 555、911、1082、1433 行等处对图片进行水平切割
我将像这样绘制前 3 条这样的线:
convert boards.png -stroke red -draw "line 0,555 12000,555" -draw "line 0,911 12000,911" -draw "line 0,1082 12000,1082" result.jpg
现在,你沿着这些线切割 - 像这样:
convert boards.png -crop x911+0+0 row1.jpg
convert boards.png -crop x416+911+1082 row2.jpg
然后在垂直方向应用完全相同的程序,将 -resize 1x!
替换为 -resize x1!
。
我有大图https://buildyourboard.pro/userboards/board-img/data/clipart.png
如何通过透明(或其他)背景将此图像分割成小图像?
图片不在网格中,所以代码应该找到图片中每张图片的位置
如果您 运行 此命令,它将 sc运行ch 所有像素到一个只有一个像素宽且具有图像原始高度的图像中。然后您会看到所有带有单词 none
的线对应于您可以在图像上绘制水平线而不与任何板背景相交的所有位置:
convert boards.png -resize 1x! txt: | more
# ImageMagick pixel enumeration: 1,4667,255,srgba
0,0: (0,0,0,0) #00000000 none
0,1: (0,0,0,0) #00000000 none
0,2: (0,0,0,0) #00000000 none
...
...
...
0,547: (0,0,0,0) #00000000 none
0,548: (0,0,0,0) #00000000 none
0,549: (0,0,0,0) #00000000 none
0,550: (0,0,0,0) #00000000 none
0,551: (0,0,0,0) #00000000 none
0,552: (0,0,0,0) #00000000 none
0,553: (0,0,0,0) #00000000 none
0,554: (0,0,0,0) #00000000 none
0,555: (39038,36633,35446,0) #988F8A00 srgba(152,143,138,0)
0,556: (38889,36248,34984,12) #978D8800 srgba(151,141,136,0.000183108)
0,557: (38348,35253,33873,75) #95898400 srgba(149,137,132,0.00114443)
0,558: (35061,31775,30664,98) #887C7700 srgba(136,124,119,0.00149538)
0,559: (33894,30508,29428,164) #84777301 srgba(132,119,115,0.00250248)
0,560: (34379,30968,29853,243) #86787401 srgba(134,120,116,0.00370794)
现在你可以看到它从水平线上没有东西到有东西的第一个地方是第 555 行。所以基本上,你想检测它从 none
到东西。
这很容易通过 awk
像这样完成:
convert boards.png -resize 1x! txt: | awk 'inside && /none/{inside=0;print;next} !inside && ! /none/{inside=1;print}'
# ImageMagick pixel enumeration: 1,4667,255,srgba
0,0: (0,0,0,0) #00000000 none
0,555: (39038,36633,35446,0) #988F8A00 srgba(152,143,138,0)
0,911: (0,0,0,0) #00000000 none
0,1082: (36701,34188,35001,0) #8F858800 srgba(143,133,136,0)
0,1433: (0,0,0,0) #00000000 none
0,1570: (33489,32153,32838,4) #827D8000 srgba(130,125,128,6.10361e-05)
0,1937: (0,0,0,0) #00000000 none
0,2135: (29884,28945,29339,4) #74717200 srgba(116,113,114,6.10361e-05)
0,2486: (0,0,0,0) #00000000 none
0,2621: (28668,27300,25241,5) #706A6200 srgba(112,106,98,7.62951e-05)
0,2972: (0,0,0,0) #00000000 none
0,3216: (35066,32529,28581,2) #887F6F00 srgba(136,127,111,3.0518e-05)
0,3612: (0,0,0,0) #00000000 none
所以,现在我们知道我们可以在第 555、911、1082、1433 行等处对图片进行水平切割
我将像这样绘制前 3 条这样的线:
convert boards.png -stroke red -draw "line 0,555 12000,555" -draw "line 0,911 12000,911" -draw "line 0,1082 12000,1082" result.jpg
现在,你沿着这些线切割 - 像这样:
convert boards.png -crop x911+0+0 row1.jpg
convert boards.png -crop x416+911+1082 row2.jpg
然后在垂直方向应用完全相同的程序,将 -resize 1x!
替换为 -resize x1!
。