改变图像的颜色 [英] Changing colour of an image

查看:275
本文介绍了改变图像的颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用RGB值更改整个图像颜色的最简单方法是什么?我试过 wand ,但是文档对我来说没有多大意义,我只能在 Pillow 文档中找到更改颜色的强度。

What is the easiest way to change the colour of the whole image with a RGB value? I have tried wand, however the documentation didn't make much sense to me, and I can only find changing the intensity of the colours in the Pillow documentation.

我在线尝试了多种解决方案,但要么他们没有做我想要的,要么已经过时而且没有用。

I tried multiple solutions online, however either they didn't do what I wanted, or were out of date and didn't work.

我想要它以便整个图像变得有色并且我可以通过改变RGB颜色来控制色调,如下所示:

I want it so that the whole image gets tinted and I can control the tint by changing the RGB colour, bit like this:

http://cdn.makeuseof。 com / wp-content / uploads / 2012/11 / Folder-Colorizer-Color-Manager.jpg?69fac7

我可以自己实现滚轮,但是实际变化的颜色部分令我困惑。希望这将是一个简单的解决方案。 :)

I can implement the wheel myself, however the actual changing colour part is confusing me. Hopefully it will be an easy solution. :)

推荐答案

这是我的代码的Python 3版本其他答案。除了为了使用 枕头而必须更改的进口外,它几乎完全相同 PIL 的分支(因为它只支持Python 3)。我做的其他更改是将 print 语句更改为函数调用,并使用 map()函数创建 luts 查找表变量。

Here's a Python 3 version of the code in my other answer. It's almost identical except for the imports which had to be changed in order to use the pillow fork of the PIL (because only it supports Python 3). The other changes I made were changing print statements into function calls and where the map() function is used to create the luts look-up table variable.

from PIL import Image
from PIL.ImageColor import getcolor, getrgb
from PIL.ImageOps import grayscale

def image_tint(src, tint='#ffffff'):
    if Image.isStringType(src):  # file path?
        src = Image.open(src)
    if src.mode not in ['RGB', 'RGBA']:
        raise TypeError('Unsupported source image mode: {}'.format(src.mode))
    src.load()

    tr, tg, tb = getrgb(tint)
    tl = getcolor(tint, "L")  # tint color's overall luminosity
    if not tl: tl = 1  # avoid division by zero
    tl = float(tl)  # compute luminosity preserving tint factors
    sr, sg, sb = map(lambda tv: tv/tl, (tr, tg, tb))  # per component
                                                      # adjustments
    # create look-up tables to map luminosity to adjusted tint
    # (using floating-point math only to compute table)
    luts = (tuple(map(lambda lr: int(lr*sr + 0.5), range(256))) +
            tuple(map(lambda lg: int(lg*sg + 0.5), range(256))) +
            tuple(map(lambda lb: int(lb*sb + 0.5), range(256))))
    l = grayscale(src)  # 8-bit luminosity version of whole image
    if Image.getmodebands(src.mode) < 4:
        merge_args = (src.mode, (l, l, l))  # for RGB verion of grayscale
    else:  # include copy of src image's alpha layer
        a = Image.new("L", src.size)
        a.putdata(src.getdata(3))
        merge_args = (src.mode, (l, l, l, a))  # for RGBA verion of grayscale
        luts += tuple(range(256))  # for 1:1 mapping of copied alpha values

    return Image.merge(*merge_args).point(luts)

if __name__ == '__main__':
    import os
    import sys

    input_image_path = 'Dn3CeZB.png'
    print('tinting "{}"'.format(input_image_path))

    root, ext = os.path.splitext(input_image_path)
    suffix = '_result_py{}'.format(sys.version_info[0])
    result_image_path = root+suffix+ext

    print('creating "{}"'.format(result_image_path))
    result = image_tint(input_image_path, '#383D2D')
    if os.path.exists(result_image_path):  # delete any previous result file
        os.remove(result_image_path)
    result.save(result_image_path)  # file name's extension determines format

    print('done')

这是图片之前和之后的图片。 测试图像和色调颜色与您在遇到时所使用的颜色相同问题。结果看起来非常类似于Py2版本,对你来说,对我来说没问题......我错过了什么?

Here's before and after images. The test image and tint color are the same as what you said you were using when you encountered the problem. The results look very similar to the Py2 version, to yours, and OK to me...am I missing something?

这篇关于改变图像的颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆