【问题标题】:Are there any high-quality, programmatic solutions for converting a jpeg with an opaque background to a png with a transparent background?是否有任何高质量的程序化解决方案可以将具有不透明背景的 jpeg 转换为具有透明背景的 png?
【发布时间】:2011-06-28 19:48:41
【问题描述】:

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

【问题讨论】:

  • 我不确定您所说的“混叠工件”是什么。也许你可以包括一个小图片来演示。
  • 他所指的锯齿来自这样一个事实,特别是在对象的边界处,像素的颜色是背景和对象颜色的混合。
  • @nobar:(反)锯齿伪影是很常见的。看到 OP 的问题以及他提到 ImageMagick 的事实以及您不知道什么是锯齿伪影这一事实,我怀疑您能否帮助他;) GIYF
  • @SyntaxT3rr0r:你成就了我的一天。哈哈

标签: image-processing png transparency jpeg antialiasing


【解决方案1】:

GIMP 中的“颜色到 Alpha”算法看起来做得很好。来源是 GPL,可以在 here 找到。 here 演示了 GIMP 算法对徽标之类的作用,颜色到 Alpha 的 GIMP 手册页为 here

看起来以编程方式执行此操作的最直接方法是使用GIMP batch mode

【讨论】:

  • 初始测试看起来令人印象深刻,请查看之前和之后的测试案例:As JPG with white bg --> As PNG with transparent bg
  • 哇,这是一个艰难的案例。字母变成了半透明,但至少抗锯齿看起来不错!
  • 我添加了一个额外的步骤,即“加倍”剩余图像以帮助摆脱字母透明度,我将发布完整的 GIMP Python 脚本 + 如何执行它。感谢您让我朝着正确的方向前进。
【解决方案2】:

正如所承诺的,这里有一个适用于普通白色 --> 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')

我使用 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())

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2015-02-16
    • 2011-04-23
    • 2021-12-02
    • 2016-12-29
    • 1970-01-01
    • 2012-02-07
    • 2011-09-10
    相关资源
    最近更新 更多