1

画像全体の色を RGB 値で変更する最も簡単な方法は何ですか? を試してみwandましたが、ドキュメントはあまり意味がありませんでしたPillow。ドキュメントで色の強度を変更することしか見つけることができませんでした。

オンラインで複数のソリューションを試してみましたが、それらは希望どおりに機能しなかったか、時代遅れで機能しませんでした。

画像全体が着色され、次のように RGB カラーを変更することで色合いを制御できるようにします。

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

ホイールを自分で実装することはできますが、実際の色の変化部分が混乱しています。うまくいけば、それは簡単な解決策になるでしょう。:)

4

2 に答える 2

4

これが私の他の回答のPython 3バージョンのコードです。pillowのフォークを使用するために変更する必要があったインポートを除いて、ほとんど同じですPIL(Python 3 のみをサポートするため)。私が行ったその他の変更は、printステートメントを関数呼び出しに変更することと、map()関数を使用してlutsルックアップ テーブル変数を作成することです。

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 バージョンと非常によく似ており、私には問題ありません...何か不足していますか?

前後の画像のスクリーンショット

于 2015-03-31T22:30:17.360 に答える