使用Graphicsmagick或pgmagick进行泛洪填充

4

问题

如何在Graphicsmagick命令行或其Python包装程序pgmagick中使用泛洪填充的好方法?

背景

到目前为止,这是我已经尝试的,但是它提示签名不匹配:

from pgmagick import Image, ColorRGB

img = Image('C:\\test.png')
cRGB = ColorRGB(256.0, 256.0, 256.0)
geo = Geometry(1,1)
img.floodFillColor(geo, cRGB, cRGB)
在 "C:/Dropbox/COC/automate/coc_automate/python/__init__.py" 的第62行,take_main_screen_shot函数出现错误
img.floodFillColor(geo, cRGB, cRGB)
Boost.Python.ArgumentError: Python中的参数类型:
    Image.floodFillColor(Image, Geometry, ColorRGB, ColorRGB)
与C++签名不匹配:
    floodFillColor(class Magick::Image {lvalue}, class Magick::Geometry, class Magick::Color, class Magick::Color)
    floodFillColor(class Magick::Image {lvalue}, class Magick::Geometry, class Magick::Color)

额外信息

如果你知道一个更好的方法来处理Python应用程序或Windows命令行中的图形操作,我很想听听你的意见。文档的状态让我觉得使用错误的工具。


你尝试过强制显式转换为颜色吗?例如 (Color)cRGB? - dlemstra
2个回答

1
正如您所说,文档并不是很好。pgmagick是C++前端的Python薄包装器,因此您必须深入接口层以弄清楚如何使其工作。除非您需要额外的功能,否则Pillow可能是更好的选择。
我一直在使用pgmagick与ImageMagick一起使用,而不是GraphicsMagick作为后端。我不知道这是否有很大的区别。无论如何,这是我需要做出的调整才能使您的代码正常工作:
  • 使用Color而不是RGBColor

    from pgmagick import Color
    color = Color('white')
    
  • 在实例化Geometry对象时提供两个额外的0:

    from pgmagick import Geometry
    geo = Geometry(0, 0, 0, 0, 1, 1)
    
  • 不要传递两个Color参数给floodFillColor,先调用fillColor,然后再调用floodFillColor,像这样:

    img.fillColor(color)
    img.floodFillColor(geo, color)
    

嘿,我想您可能认为这应该是一条注释而不是对问题的回答? - Chris Dutrow
我已经扩展了答案。 - Pitarou

1
我建议您查看Python Imaging Library(PIL)。例如,在图像上绘制灰色十字
import Image, ImageDraw

im = Image.open("lena.pgm")

draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0, im.size[1], im.size[0], 0), fill=128)
del draw 

# write to stdout
im.save(sys.stdout, "PNG")

1
根据我所阅读的资料,PIL现在几乎被放弃了,我们都应该使用Pillow。 - Pitarou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接