将带有 ImageMagick 指令的 Bash 脚本分割成更小的部分?

问题描述 投票:0回答:3

我有这个 bash 脚本,将绘图信息输入 ImageMagick,它的开头如下:

#!/bin/bash 
convert -size 2200x2200 xc:white \
-fill '#FFFEFF' -draw 'point 1112,1111' \
-fill '#FFFEFE' -draw 'point 1112,1112' \
-fill '#FFFEFE' -draw 'point 1111,1112' \
-fill '#FFFEFE' -draw 'point 1110,1112' \
-fill '#FFFEFE' -draw 'point 1110,1111' \
******ON & ON 4.2 MILLION LINES MORE*******
spectrumspiral.png;

我的问题是我不断收到有关参数列表太长的警告,终端显示“已杀死”,有关“fork:无法分配内存等”的警告。

我尝试将

ulimit -s
调整为更高的值,但无济于事。真的很想制作这个图像。知道如何一次提供该脚本的终端块吗?或者为此目的做一些事情。

我听说 xargs 可以用于类似的事情,但我一直无法找到适合这个问题本质的具体实现。

bash imagemagick xargs
3个回答
1
投票

如果您创建一个包含 4 个像素的图像(1 个红色、1 个白色、1 个蓝色和 1 个黑色),您可以告诉 ImageMagick 将结果图像输出为文本文件,如下所示:

convert -size 1x1 xc:red xc:white xc:blue xc:black +append -depth 8 -colorspace RGB image.txt

# ImageMagick pixel enumeration: 4,1,255,rgb
0,0: (255,0,0)  #FF0000  rgb(255,0,0)
1,0: (255,255,255)  #FFFFFF  rgb(255,255,255)
2,0: (0,0,255)  #0000FF  rgb(0,0,255)
3,0: (0,0,0)  #000000  rgb(0,0,0)

同样,如果您将该文本文件输入 ImageMagick,它可以重新创建图像:

cat image.txt | convert txt:- output.img

因此,我们需要做的就是将您的

-fill
命令转换为 ImageMagick 喜欢的格式的文本文件。所以我们可以这样做
yourFile

sed -E 's/.*(#[0-9A-F]+).* ([0-9]+)\,([0-9]+).*/\2,\3:\1/g' yourFile

我们会得到这样的结果:

0,0:#3C4AD8
0,1:#269531
0,2:#CF2C7C
...
...

然后我们可以通过管道输入

awk
来重新排列 ImageMagick 喜欢的方式:

awk -F: '
 BEGIN{print "# ImageMagick pixel enumeration: 2200,2200,255,rgb"}
 {
    coords=$1;colour=$2
    rh="0x" substr(colour,2,2);
    gh="0x" substr(colour,4,2);
    bh="0x" substr(colour,6,2);
    r=strtonum(rh);
    g=strtonum(gh);
    b=strtonum(bh);
    printf "%s: (%d,%d,%d) %s\n",coords,r,g,b,colour;
 }'

因此,如果我们将所有这些放在一起,以下脚本应该能够将您喜爱的图像创建到文件中

spectrumspiral.png

#!/bin/bash
sed -E 's/.*(#[0-9A-F]+).* ([0-9]+)\,([0-9]+).*/\2,\3:\1/g' yourFile | awk -F: '
 BEGIN{print "# ImageMagick pixel enumeration: 2200,2200,255,rgb"}
 {
    coords=$1;colour=$2
    rh="0x" substr(colour,2,2);
    gh="0x" substr(colour,4,2);
    bh="0x" substr(colour,6,2);
    r=strtonum(rh);
    g=strtonum(gh);
    b=strtonum(bh);
    printf "%s: (%d,%d,%d) %s\n",coords,r,g,b,colour;
 }' | convert txt:- spectrumspiral.png

1
投票

尝试使用 shell 的此处文档

#!/bin/bash 

convert - <<EOS spectrumspiral.png
-size 2200x2200 xc:white  
-fill '#FFFEFF' -draw point '1112,1111'
-fill '#FFFEFE' -draw 'point 1112,1112'
-fill '#FFFEFE' -draw 'point 1111,1112'
-fill '#FFFEFE' -draw 'point 1110,1112'
-fill '#FFFEFE' -draw 'point 1110,1111'
# ******ON & ON 4.2 MILLION LINES MORE*****
EOS

我的系统没有

convert
,所以我可以测试这是否有效。

大多数 Linux 程序(包括

convert
)可以接受来自 StdIn 的输入,在上面的 cmd 行中由
-
字符表示。
-
告诉命令期待输入,不是来自文件,而是好像在键盘上键入,即 StdIn。
<<EOS .... EOS
是此处文档,它代表 bash 将所有文本“输入”到命令 stdIn 输入中。

你可能需要也可能不需要所有的引用,如果你已经有了,我认为这不会有什么坏处。如果这不起作用,请使用一个小的输入示例文件(如上所示)并测试各种场景,直到它为您创建一个文件。


0
投票

实际上,您可以使用“神奇脚本”更简单地完成此操作。只需将所有命令放入文本文件中并调用:

magick -script cmds.mgk

将所有命令保存在名为

cmds.mgk
的文件中,格式如下:

size 3x1 xc:black
-fill red  -draw "point 0,0"
-fill lime -draw "point 1,0"
-fill blue -draw "point 2,0"
-scale 100x
-write result.png

© www.soinside.com 2019 - 2024. All rights reserved.