Заливка с помощью Graphicsmagick или pgmagick

Вопрос

Каков хороший способ использовать заливку с помощью командной строки Graphicsmagick или ее оболочки pgmagick для python?

Задний план

Пока это то, что у меня есть, но говорится, что подписи не совпадают:

Code:
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)
Error:
  File "C:/Dropbox/COC/automate/coc_automate/python/__init__.py", line 62, in take_main_screen_shot
    img.floodFillColor(geo, cRGB, cRGB)
Boost.Python.ArgumentError: Python argument types in
    Image.floodFillColor(Image, Geometry, ColorRGB, ColorRGB)
did not match C++ signature:
    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, я весь в ушах. Мне начинает казаться, что я использую неправильный инструмент для этого с состоянием документации.


person Chris Dutrow    schedule 10.12.2013    source источник
comment
Вы пытались принудительно выполнить явное приведение к цвету, например. (Цвет)cRGB?   -  person dlemstra    schedule 10.12.2013


Ответы (2)


Я бы порекомендовал взглянуть на библиотеку изображений Python (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")
person Jens Timmerman    schedule 11.12.2013
comment
Согласно источникам, которые я читал, PIL в настоящее время в значительной степени заброшен, и вместо этого мы все должны использовать Pillow. - person Pitarou; 08.03.2014

Как вы говорите, документация невелика. pgmagick — это тонкая оболочка Python для внешнего интерфейса C++, поэтому вам придется копаться в слоях интерфейса, чтобы понять, как заставить его работать. Если вам не нужны дополнительные функции, Pillow, вероятно, будет лучшим выбором.

Я использовал pgmagick с ImageMagick, а не с GraphicsMagick в качестве серверной части. Я не знаю, имеет ли это большое значение. В любом случае, вот настройки, которые мне нужно было сделать, чтобы заставить ваш код работать:

  • использовать цвет, а не RGBColor

    from pgmagick import Color
    color = Color('white')
    
  • предоставьте еще два 0 при создании экземпляра объекта Geometry:

    from pgmagick import Geometry
    geo = Geometry(0, 0, 1, 1)
    
  • вместо того, чтобы передавать два аргумента цвета в функцию fludFillColor, сначала вызовите fillColor, а затем вызовите fluxFillColor, например:

    img.fillColor(color)
    img.floodFillColor(geo, color)
    
person Pitarou    schedule 07.03.2014
comment
Эй, я думаю, вы могли бы иметь в виду, что это комментарий, а не ответ на вопрос? - person Chris Dutrow; 07.03.2014
comment
я расширил ответ - person Pitarou; 08.03.2014