Существуют ли качественные программные решения для преобразования jpeg с непрозрачным фоном в png с прозрачным фоном? - PullRequest
6 голосов
/ 17 февраля 2011

Обычный пример использования - загрузка логотипа JPEG с белым / цветным фоном. (Довольно) просто переключить белые пиксели на прозрачные, но это оставляет артефакты наложения. Идеальное решение, по существу, «отменяет» псевдонимы (учитывая известный цвет фона). Как минимум, решение должно побить скрипт bg_removal для ImageMagick (http://imagemagick.org/Usage/scripts/bg_removal).

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Алгоритм "Color to Alpha" в GIMP выглядит довольно неплохо. Источник - GPL и может быть найден здесь . Демонстрация того, что алгоритм GIMP делает с чем-то вроде логотипа: здесь , а страница руководства GIMP для Color-to-Alpha здесь .

Похоже, что наиболее простой способ сделать это программно - использовать пакетный режим GIMP .

1 голос
/ 27 февраля 2011

Как и было обещано, вот рабочее решение для общего варианта использования белого -> альфа. Это выполняется на сервере Ubuntu 10.04.1 LTS со стандартной установкой GIMP (2.6.8).

from gimpfu import *

def run(input_filepath):
    image = pdb.gimp_file_load(input_filepath, input_filepath)
    image.disable_undo()
    layer = image.active_layer
    if not layer.is_rgb:
        pdb.gimp_image_convert_rgb(image)

    white = gimpcolor.RGB(1.0, 1.0, 1.0, 1.0)
    bg_color = pdb.gimp_image_pick_color(image, layer, 0, 0, True, False, 0)
    if bg_color == white:
        pdb.plug_in_colortoalpha(image, layer, bg_color)
        layer_copy = layer.copy()
        image.add_layer(layer_copy)
        image.merge_visible_layers(CLIP_TO_IMAGE)

    pdb.file_png_save_defaults(image, image.active_layer, input_filepath, input_filepath)

run('%(input_filepath)s')

Я выполняю этот код из Python (в Django), используя модуль подпроцесса (code_as_string - приведенный выше код в виде строки со вставленным input_filepath:

gimp_args = (settings.PATH_TO_GIMP, 
    '-i', 
    '--batch-interpreter=python-fu-eval', 
    '-b', code_as_string,
    '-b', 'from gimpfu import pdb; pdb.gimp_quit(True)')

environ = os.environ.copy()
environ['GIMP2_DIRECTORY'] = settings.PATH_TO_GIMP_DIR
p = subprocess.Popen(gimp_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=environ)
rc = p.wait()
if rc:
    logging.error(p.stdout.read())
...