如何将 ImageMagick 转换命令的结果作为位图数据
How to get the result of an ImageMagick convert command as bitmap data
我正在从事一个项目,该项目将从图像制作拼图游戏并将其作为浏览器中的单独部分呈现给用户。我已经完成了 Python 中的所有原型设计。目前我可以为每个拼图制作单独的图像。
作为最后一步,我想在零件上做一个漂亮的斜角,使它们看起来更逼真。我找到了一个 ImageMagick convert 命令可以很好地做到这一点:
convert piece.png -alpha extract -blur 0x2 -shade 120x30 piece.png -compose Overlay -composite piece.png -alpha on -compose Dst_In -composite result.png
我使用 os.system 执行命令,但这需要很长时间才能完成。
你能给我一个以最快的方式执行 ImageMagick 处理的解决方案的建议吗?我认为这将涉及直接使用 ImageMagick 库执行处理,将输入位图数据发送给它,并将结果也作为位图数据接收。然后我可以将结果流式传输给用户。解决方案不必是 Python.
更新
我刚刚再次查看了您的命令 - 我假设它是明智的,因为您暗示您是从 Anthony Thyssen 出色的 ImageMagick 使用页面获得的 - 但是我看到您正在阅读图像 piece.png
三次,必须使用-clone
或-write MPR:save
才能避免。让我再做一些实验。我没有你的拼图来测试,所以我在这里一无所知,但你必须能够将你的命令更改为这样的东西:
convert piece.png -write mpr:piece \
\( +clone -alpha extract -blur 0x2 -shade 120x30 \) \
-compose Overlay -composite \
mpr:piece -alpha on -compose Dst_In -composite result.png
MPR 是一个内存程序寄存器,或者基本上是 ImageMagick 可以读取和写入的命名 RAM 块。有细节和例子here.
原答案
三件事 spring 需要注意...哪一件或哪几件事的组合会有所帮助取决于您的 CPU、内存和磁盘的规格以及您的件 - none 我知道或可以测试的,
首先,如果您使用了这些库,则可以避免为 运行 convert
创建新进程的开销 - 这样应该会有所帮助,但如果您的部分很大并且存在瓶颈实际上是处理,使用库差别不大。
其次,如果您的图像很大,从磁盘读取它们并将它们写回磁盘的时间可能会降低您的性能。为了测试这个,我会创建一个小的 RAMdisk 并将图像存储在那里,看看是否有帮助。这是一个快速且相对容易的测试。
第三,我假设您正在生成许多片段,并且您目前正在以顺序方式一个接一个地生成它们。如果是这种情况,我肯定会建议使用多线程。要么在您的代码中使用您的语言的线程环境执行此操作,要么尝试 GNU Parallel,这对我来说一直很出色。所以,如果你打算做
convert piece1.png -alpha extract ... -composite result1.png
convert piece2.png -alpha extract ... -composite result2.png
convert piece3.png -alpha extract ... -composite result3.png
...
convert piece1000.png -alpha extract ... -composite result1000.png
只需将所有这些命令发送到其 stdin 上的 GNU Parallel,它将在您的 CPU 拥有的尽可能多的内核上并行执行它们,就像这样
(
echo convert piece1.png ... -composite result1.png
echo convert piece2.png ... -composite result2.png
echo convert piece3.png ... -composite result3.png
) | parallel
或者像这样构建命令
parallel convert {} -alpha ..... result-{} ::: piece*.png
我正在从事一个项目,该项目将从图像制作拼图游戏并将其作为浏览器中的单独部分呈现给用户。我已经完成了 Python 中的所有原型设计。目前我可以为每个拼图制作单独的图像。
作为最后一步,我想在零件上做一个漂亮的斜角,使它们看起来更逼真。我找到了一个 ImageMagick convert 命令可以很好地做到这一点:
convert piece.png -alpha extract -blur 0x2 -shade 120x30 piece.png -compose Overlay -composite piece.png -alpha on -compose Dst_In -composite result.png
我使用 os.system 执行命令,但这需要很长时间才能完成。
你能给我一个以最快的方式执行 ImageMagick 处理的解决方案的建议吗?我认为这将涉及直接使用 ImageMagick 库执行处理,将输入位图数据发送给它,并将结果也作为位图数据接收。然后我可以将结果流式传输给用户。解决方案不必是 Python.
更新
我刚刚再次查看了您的命令 - 我假设它是明智的,因为您暗示您是从 Anthony Thyssen 出色的 ImageMagick 使用页面获得的 - 但是我看到您正在阅读图像 piece.png
三次,必须使用-clone
或-write MPR:save
才能避免。让我再做一些实验。我没有你的拼图来测试,所以我在这里一无所知,但你必须能够将你的命令更改为这样的东西:
convert piece.png -write mpr:piece \
\( +clone -alpha extract -blur 0x2 -shade 120x30 \) \
-compose Overlay -composite \
mpr:piece -alpha on -compose Dst_In -composite result.png
MPR 是一个内存程序寄存器,或者基本上是 ImageMagick 可以读取和写入的命名 RAM 块。有细节和例子here.
原答案
三件事 spring 需要注意...哪一件或哪几件事的组合会有所帮助取决于您的 CPU、内存和磁盘的规格以及您的件 - none 我知道或可以测试的,
首先,如果您使用了这些库,则可以避免为 运行 convert
创建新进程的开销 - 这样应该会有所帮助,但如果您的部分很大并且存在瓶颈实际上是处理,使用库差别不大。
其次,如果您的图像很大,从磁盘读取它们并将它们写回磁盘的时间可能会降低您的性能。为了测试这个,我会创建一个小的 RAMdisk 并将图像存储在那里,看看是否有帮助。这是一个快速且相对容易的测试。
第三,我假设您正在生成许多片段,并且您目前正在以顺序方式一个接一个地生成它们。如果是这种情况,我肯定会建议使用多线程。要么在您的代码中使用您的语言的线程环境执行此操作,要么尝试 GNU Parallel,这对我来说一直很出色。所以,如果你打算做
convert piece1.png -alpha extract ... -composite result1.png
convert piece2.png -alpha extract ... -composite result2.png
convert piece3.png -alpha extract ... -composite result3.png
...
convert piece1000.png -alpha extract ... -composite result1000.png
只需将所有这些命令发送到其 stdin 上的 GNU Parallel,它将在您的 CPU 拥有的尽可能多的内核上并行执行它们,就像这样
(
echo convert piece1.png ... -composite result1.png
echo convert piece2.png ... -composite result2.png
echo convert piece3.png ... -composite result3.png
) | parallel
或者像这样构建命令
parallel convert {} -alpha ..... result-{} ::: piece*.png