【问题标题】:ImageMagick drawing a series of images with growing glow effectImageMagick 绘制一系列具有生长发光效果的图像
【发布时间】:2013-07-03 19:10:27
【问题描述】:

我正在学习 ImageMagick。我想(使用 ImageMagick)创建一系列图像 使用命令后的那个

convert -delay 0 -loop 0 frame*.gif final.gif

给出的结果就像附加的动画 gif 一样。

我想自己编写这一系列命令,但我需要提示哪些效果和绘图指令会给我最相似的结果,所以我正在寻找类似的东西:

  • 画一个圆
  • 模糊它
  • 保存框架
  • 增加圆的半径
  • 重复

但是,可能以上还不够。

这个问题是不是很模糊,或者有人可以给我一个提示吗?

【问题讨论】:

  • 你反对使用python生成你需要的图像,然后将它们传递给ImageMagick来创建一个动画gif吗?

标签: imagemagick


【解决方案1】:

如果您在 shell 环境(OSX 或 Linux)中,您可以执行以下操作,这会在不断增加的半径中创建一系列模糊的圆圈,并将图像保存在适当命名的文件中...

for RAD in {10,20,30,40,50,60,70,80,90}; do convert -size 400x300 xc:black -fill cyan -stroke cyan -draw "translate 200,150 circle 0,0 $RAD,0" -blur 0x8 blur_circle$RAD.gif; done

为了更漂亮,您可以添加重复的模糊操作,或者为更大的半径添加更多模糊。

然后,按照您的建议将它们转换为动画 gif:

convert -delay 0 -loop 0  blur_circle*.gif final.gif

编辑

更接近原始“愿景”的工作版本

这里是使用python生成两个圆的版本,其透明度在不同的时间尺度上有所不同。在当前设置下,随着时间的推移,透明度看起来像这张图,但您可以生成任何整数值列表以获得不同的效果:

这是程序生成的图像:

这是程序本身:

#! /usr/bin/env python
""" Using imagemagick, generate a series of .gifs with fuzzy circles in them... 

When the program is done, create an animated gif with:
    convert -delay 0 -loop 0  blur_circle*.gif final.gif

(P.S. I know it is not 'convention' to capitalize variable names, but it makes
it easier to distinguish my definitions from built-ins)"""

import subprocess
import sys

CanvasW = 400
CanvasH = 400
CenterX = int(CanvasW/2)
CenterY = int(CanvasH/2)
InnerDia = 75
OuterDia = 155

BaseNameString = "blur_circles"

# play with overall blur level - 2 to 8
# this is in addition to the distance fuzzing
BlurLevel = '8'

# The following three lists must be the same length
# Transparency levels of the inner circle, ramping up and down 
InnerAlphaList = range(0,101,10)  + range(90,9,-20) + [5,0,0,0]
print "Inner:",len(InnerAlphaList),InnerAlphaList

# Transparency of the outer circle
OuterAlphaList = range(0,51,8) +  range(40,9,-12) + range(8,0,-2) + [0,0,0,0,0,0]
print "Outer:",len(OuterAlphaList), OuterAlphaList

# Add 100 so the file names get sorted properly?
NameNumberList = range(101, 101+len(InnerAlphaList))

# Changing the Euclidaan distance parameters affects how fuzzy the objects are

BaseCommand = '''convert -size {w}x{h} xc:black \
  -fill  "rgba( 0, 255,255 , {outal:0.1f} )" -stroke  none -draw "translate {cenx},{ceny} circle 0,0 {outdia},0" -morphology Distance Euclidean:4,1000\
  -fill  "rgba( 0, 255,255 , {inal:0.1f} )"  -stroke  none -draw "translate {cenx},{ceny} circle 0,0 {india},0"  -morphology Distance Euclidean:4,500 \
  -blur 0x{blur} {basename}_{namenum}.gif'''

sys.stderr.write("Starting imagegen .")
for InAlpha,OutAlpha,NameNumber in  zip(InnerAlphaList,OuterAlphaList,NameNumberList):
    FormattedCommand = BaseCommand.format(
        w = CanvasW, h = CanvasH,
        cenx = CenterX, ceny = CenterY,
        india = InnerDia, outdia = OuterDia,
        blur = BlurLevel,
        inal = InAlpha/100.0, outal = OutAlpha/100.0,
        basename = BaseNameString,
        namenum = NameNumber
    )
    sys.stderr.write(".")
    # sys.stderr.write("{}\n".format(FormattedCommand))

    ProcString = subprocess.check_output(FormattedCommand, stderr=subprocess.STDOUT,shell=True) 
    if ProcString:
        sys.stderr.write(ProcString)
sys.stderr.write(" Done.\n")




""" BASE COMMANDS:
 # inner circle:
 convert -size 400x300 xc:black -fill  "rgba( 0, 255,255 , 1 )" -stroke  none -draw "translate 200,150 circle 0,0 75,0" -blur 0x8 -morphology Distance Euclidean:4,1000  blur_circle100.gif

 #outer circle
 convert -size 400x300 xc:black -fill  "rgba( 0, 255,255 , .5 )" -stroke  none -draw "translate 200,150 circle 0,0 150,0"  -morphology Distance Euclidean:4,500  -blur 0x6 blur_circle100.gif

 #both circles
 convert -size 400x300 xc:black -fill  "rgba( 0, 255,255 , .5 )" -stroke  none -draw "translate 200,150 circle 0,0 150,0"  -morphology Distance Euclidean:4,500 \
  -fill  "rgba( 0, 255,255 , 1 )" -stroke  none -draw "translate 200,150 circle 0,0 75,0" -morphology Distance Euclidean:4,1000\
  -blur 0x8 blur_circle100.gif
"""

【讨论】:

  • 几乎是想要的结果。正如您在问题的 gif 中看到的那样,这里有“两个”圆圈,它们的“发光”不同。外圈(大)和小圈圈一起长大,过了一会儿,大圈先变小,小圈变慢得多。主要问题是如何在一系列图像中实现那些“两个圆圈”的效果。如果你能弄清楚这一点,我会立即接受。 ;)(是的,我同时使用 Linux 和 OS X——所以任何 UNIXish 工具都没有问题)
  • 好吧,我不知道你想要的原始图像有多“喜欢”。我会玩这个,但可能会使用 python 来组织对 imagemagick 的调用,因为移动部件的数量增加了......原始图像看起来像圆圈的透明度正在改变,但不是大小......跨度>
  • 伙计,提前谢谢你;)。 Python 没问题 - 我会自己将其重写为 perl(我最喜欢的语言)。如果您需要知道 - 我将在更大(且持续时间更长)动画 gif 中多次使用序列 - 作为“爆炸” - 在更大图片的不同部分......;)
  • @jm666 我听到了——我以前用过 PERL,但现在看不下去了 ;^)。祝翻译顺利。我希望这个版本能给你一个开始的基准。如果 alpha 没有给您正确的效果,请使用 distance
  • 太棒了! :) 非常感谢 - 可以在 2 小时内奖励赏金... ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多