Замените цвет с помощью python Wand, но координаты неизвестны

Я знаю о замене цвета с помощью Wand и Изменить цвет определенных пикселей [Wand], но оба они используют строку вроде

    draw.color(192,84,'replace')

В котором вам нужно передать местоположение пикселя соответствующего цвета. Что, если вы знаете цвет, который хотите заменить, но не знаете его местонахождение? Я хочу заменить цвет пикселей в изображении, не передавая ссылку на местоположение пикселя этого цвета. Вам действительно нужно сканировать все изображение в поисках чего-то, о чем вы уже знаете?

Эквивалент imagemagick будет

convert balloon.gif -fill white -opaque blue balloon_white.gif

person Belasco    schedule 21.02.2018    source источник
comment
Вы можете попробовать PythonMagick от разработчиков ImageMagick.   -  person fmw42    schedule 22.02.2018
comment
Я попробую посмотреть на PythonMagick. Похоже, вам нужно обратиться к документации C++, чтобы понять это. Честно говоря, я немного не понимаю, какой модуль использовать для управления изображениями в python.   -  person Belasco    schedule 23.02.2018


Ответы (2)


Если вы хотите соответствовать функциональности -opaque, вам необходимо реализовать метод MagickOpaquePaintImage C.

import ctypes
from wand.api import library
from wand.image import Image
from wand.color import Color
from wand.compat import nested

# Map C-API to Python
library.MagickOpaquePaintImage.argtypes = (ctypes.c_void_p,  # Wand
                                           ctypes.c_void_p,  # target
                                           ctypes.c_void_p,  # fill
                                           ctypes.c_double,  # fuzz
                                           ctypes.c_bool)    # invert

with Image(filename='rose:') as img:
    with nested(Color('#E93A43'), Color('ORANGE')) as (target, fill):
        library.MagickOpaquePaintImage(img.wand,
                                       target.resource,
                                       fill.resource,
                                       img.quantum_range * 0.10, # -fuzz 10%
                                       False)
    img.save(filename='output.png')

output.png

person emcconville    schedule 22.02.2018
comment
Спасибо @emcconville, это абсолютно работает. Мне любопытно узнать, какие ресурсы вы использовали для создания этого ответа, чтобы я мог сделать это для себя однажды;) - person Belasco; 23.02.2018
comment
Рад помочь. Если это ответило на ваш первоначальный вопрос, пожалуйста, отметьте это как «Принято», чтобы другие читатели знали, что ваша проблема решена. Что касается ресурсов, которые помогут понять: в этом прелесть OpenSource, ничто не мешает вам прочитать исходный код, и как только вы получите общее представление о замысле авторов, все привязки к перенесенным языкам станут совершенно ясными. - person emcconville; 23.02.2018

Начиная с версии 0.5.4, метод opaque_paint является доступно, поэтому умный хак, предложенный @emcconville, больше не требуется. Вы можете сделать просто:

from wand.image import Image
with Image(filename='rose:') as im:
  im.opaque_paint(target='#E93A43', fill='Orange', fuzz=0.10)
  im.save(filename='output.png')
person vokimon    schedule 28.09.2019