広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

Pythonでランダムにグラデーションを作成する

Pythonでグラデーションを作る方法とランダムに整数を発生する方法は、いずれもこのサイトを参照

note.nkmk.me

note.nkmk.me

グラデーション画像の作成

参照ページの通り。解像度の縦横分の行列を、3色混合分3枚作るイメージ。

import numpy as np
def get_gradient_2d(start,stop,width,height,is_horizontal):
    if is_horizontal:
        return np.tile(np.linspace(start,stop,width),(height,1))
    else:
        return np.tile(np.linspace(start,stop,height),(width,1)).T
def get_gradient_3d(width,height,start_list,stop_list,is_horizontal_list):
    result = np.zeros((height,width,len(start_list)),dtype=np.float)
    for i,(start,stop,is_horizontal) in enumerate(zip(start_list,stop_list,is_horizontal_list)):
        result[:,:,i] = get_gradient_2d(start,stop,width,height,is_horizontal)
    return result
from PIL import Image

作例の通りモノクロなら以下

array = get_gradient_3d(1920,1080,(0,0,0),(255,255,255),(True,True,True))
Image.fromarray(np.uint8(array)).save("gradient_gray.png",quality=95)

f:id:yyhhyy:20211127181045p:plain

赤から白のグラデーションにしたければ、スタートのRGBのRを高くすれば良い

array = get_gradient_3d(1920,1080,(255,0,0),(255,255,255),(True,True,True))
Image.fromarray(np.uint8(array)).save("gradient_red.png",quality=95)

f:id:yyhhyy:20211127181113p:plain

よくある感じのグラデーションにするなら、比較的近い色から近い色への変化にする

array = get_gradient_3d(1920,1080,(210,40,40),(240,40,40),(True,True,True))
Image.fromarray(np.uint8(array)).save("gradient_red_light.png",quality=95)

f:id:yyhhyy:20211127181138p:plain

ランダムなグラデーション

RGBの値をランダムに与えれば、ランダムなグラデーションになる。 乱数は、random関数のrandintを使えばいい。

import random
R_start = random.randint(0,255)
G_start = random.randint(0,255)
B_start = random.randint(0,255)
R_end = random.randint(0,255)
G_end = random.randint(0,255)
B_end = random.randint(0,255)

1色だけ鉛直方向のグラデーションに変えるとより複雑なグラデーションになる

array = get_gradient_3d(1920,1080,(R_start,G_start,B_start),(R_end,G_end,B_end),(True,False,True))
Image.fromarray(np.uint8(array)).save("gradient.png",quality=95)

f:id:yyhhyy:20211127181228p:plain

f:id:yyhhyy:20211127181433p:plain

f:id:yyhhyy:20211127181506p:plain

気に入った色が出たときの値をメモしておけば良い。但しどの色の縦横を変えたかも残しておく必要がある。

print(R_start,G_start,B_start,R_end,G_end,B_end)
223 60 103 146 12 38