是否有任何高质量的程序化解决方案,用于将具有不透明背景的jpeg转换为具有透明背景的png?

Jer*_*wis 6 png transparency jpeg image-processing antialiasing

这里的常见用例是用户上传带有白色/彩色背景的jpeg徽标.将白色像素切换为透明像素(相当)很简单,但这会留下锯齿现象.理想的解决方案基本上"撤消"混叠(给定已知的背景颜色).至少,该解决方案必须击败ImageMagick的bg_removal脚本(http://imagemagick.org/Usage/scripts/bg_removal).

Jer*_*wis 1

正如所承诺的,这是常见的白色 --> alpha 用例的可行解决方案。它在具有标准 GIMP 安装 (2.6.8) 的 Ubuntu 10.04.1 LTS 服务器上运行。

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')
Run Code Online (Sandbox Code Playgroud)

我使用 subprocess 模块从 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())
Run Code Online (Sandbox Code Playgroud)