Python更改渐变以对角开始

Python更改渐变以对角开始,python,python-imaging-library,python-3.4,pillow,Python,Python Imaging Library,Python 3.4,Pillow,我有一个生成梯度的简单函数。我想将渐变方向更改为从左上角的对角线开始 im = Image.new('RGB', (300, 300)) ld = im.load() # A map of rgb points in your distribution # [distance, (r, g, b)] # distance is percentage from left edge heatmap = [ [0.0, (0, 0, 0)], [1.00, (0.8, 0.0, 1

我有一个生成梯度的简单函数。我想将渐变方向更改为从左上角的对角线开始

im = Image.new('RGB', (300, 300))
ld = im.load()

# A map of rgb points in your distribution
# [distance, (r, g, b)]
# distance is percentage from left edge
heatmap = [

    [0.0, (0, 0, 0)],
    [1.00, (0.8, 0.0, 1.0)],
]


def gaussian(x, a, b, c, d=0):
    return a * math.exp(-(x - b) ** 2 / (2 * c ** 2)) + d


def pixel(x, width=100, map=[], spread=1):
    width = float(width)
    r = sum([gaussian(x, p[1][0], p[0] * width, width / (spread * len(map))) for p in map])
    g = sum([gaussian(x, p[1][1], p[0] * width, width / (spread * len(map))) for p in map])
    b = sum([gaussian(x, p[1][2], p[0] * width, width / (spread * len(map))) for p in map])
    return min(1.0, r), min(1.0, g), min(1.0, b)


for x in range(im.size[0]):
    r, g, b = pixel(x, width=300, map=heatmap)
    r, g, b = [int(256 * v) for v in (r, g, b)]
    for y in range(im.size[1]):
        ld[x, y] = r, g, b
我发现我可以改变方向从上到下,从左到右,但不知道如何改变它的对角线

for y in range(im.size[1]):
    ld[y, x] = r, g, b


使用当前的功能和方式是否可以实现这一点?

您的
宽度应为300*300
然后用下面的循环替换您的循环应该可以工作

for y in range(im.size[1]-1):
    r, g, b = pixel(y, width=300*300, map=heatmap)
    r, g, b = [int(256 * v) for v in (r, g, b)]
    for x_ in range(y+1):
        ld[x_,y - x_] = r, g, b

for x in range(im.size[0]):
    r, g, b = pixel(300+x, width=300*300, map=heatmap)
    r, g, b = [int(256 * v) for v in (r, g, b)]
    for y_ in range(im.size[1]):
        ld[x - y_,y_] = r, g, b

未经测试,但类似的方法应该有效

尝试以下方法:

for y in range(im.size[1]-1):
    r, g, b = pixel(y, width=300*300, map=heatmap)
    r, g, b = [int(256 * v) for v in (r, g, b)]
    for x_ in range(y+1):
        ld[x_,y - x_] = r, g, b

for x in range(im.size[0]):
    r, g, b = pixel(300+x, width=300*300, map=heatmap)
    r, g, b = [int(256 * v) for v in (r, g, b)]
    for y_ in range(im.size[1]):
        ld[x - y_,y_] = r, g, b
heatmap = [

    [0.0, (0, 0, 0)],
    [1.00, (0.8, 0.0, 1.0)],
]

# x y coordinates of starting point for gradient
start_x = 0
start_y = 0

for x in range(im.size[0]):
    for y in range(im.size[1]):
        # taxicab distance for linear gradient 
        dist = math.fabs(start_x - x) + math.fabs(start_y - y)
        # for circular gradient
        # dist = math.sqrt(math.pow(start_x - x,2) + math.pow(start_y - y,2))
        start_rgb = heatmap[0][1]
        end_rgb = heatmap[1][1]
        dist = dist / (im.size[0] + im.size[1])
        # for circular gradient
        # dist = dist / (math.sqrt(math.pow(im.size[0],2) + math.pow(im.size[1],2)) 
        r, g, b = map(lambda x,y: x+y, map(lambda a: a*dist, start_rgb), map(lambda b: b*dist, end_rgb))
        r, g, b = [int(256 * v) for v in (r, g, b)]
        ld[x, y] = r, g, b
我假设
start_x
start_y
位于图像的四个角之一。相应地调整
start_x-x
start_y-y
,如果它不是这样的话。

您可能会发现第一个程序很有用。