Python 改变渐变从对角线开始
Python change gradient to start diagonally
我有一个生成渐变的简单函数。我想改变渐变的方向,从 对角线左上角开始 。
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
给...
for y in range(im.size[1]):
ld[x, y] = r, g, b
给...
这是否可以使用当前函数以及如何实现?
你的width
应该是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
未测试,但类似的东西应该可以工作
尝试这样的事情:
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
。
我是这样做的,以防万一有人在 pygame 中这样做并且正在挣扎
gradient = pygame.PixelArray(WIN)
start_rgb = (0, 0, 255)
end_rgb = (255, 20, 147)
for x in range(WIDTH):
for y in range(HEIGHT):
dist = x + y
dist /= WIDTH + HEIGHT
# Now dist will be a normalized value, between 0 and 1
r, g, b = map(lambda start, end: start + end, map(lambda _a: max(0, _a - (255 * dist)), start_rgb), map(lambda _b: _b * dist, end_rgb))
gradient[x][y] = r, g, b
我知道这几乎是第一人称答案的副本,但我花了 2 天时间才理解,所以我决定这样做
首先我们制作渐变变量,它具有window
中每个像素的颜色
然后我们制作 start_rgb 和 end_rgb 变量
然后我们遍历 window 中的每个像素并使 dist 变量成为
我们制作了 r、g 和 b 变量,这里我们有三个映射函数:
map(lambda _a: max(0, _a - (255 * dist)), start_rgb)
在这里,我们遍历 start_rgb 中的每个元素并减去 255(pygame 中的最大颜色值)* dist,这将在开始时为 0,在结束时为 1。我们使用 max 函数,这样如果数字小于零,它将被设置为零
map(lambda _b: _b * dist, end_rgb)
这里我们遍历 end_rgb 中的每个元素并将其乘以 dist
map(lambda start, end: start + end, map(...), map(...))
这里我们只是把我讲的第一个map函数和我讲的第二个map函数得到的结果相加
然后,这里:gradient[x][y] = r, g, b
我们将 x,y 中的像素设置为我们刚刚计算的颜色
这是您应该从这段代码中得到的结果 result
我有一个生成渐变的简单函数。我想改变渐变的方向,从 对角线左上角开始 。
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
给...
for y in range(im.size[1]):
ld[x, y] = r, g, b
给...
这是否可以使用当前函数以及如何实现?
你的width
应该是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
未测试,但类似的东西应该可以工作
尝试这样的事情:
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
。
我是这样做的,以防万一有人在 pygame 中这样做并且正在挣扎
gradient = pygame.PixelArray(WIN)
start_rgb = (0, 0, 255)
end_rgb = (255, 20, 147)
for x in range(WIDTH):
for y in range(HEIGHT):
dist = x + y
dist /= WIDTH + HEIGHT
# Now dist will be a normalized value, between 0 and 1
r, g, b = map(lambda start, end: start + end, map(lambda _a: max(0, _a - (255 * dist)), start_rgb), map(lambda _b: _b * dist, end_rgb))
gradient[x][y] = r, g, b
我知道这几乎是第一人称答案的副本,但我花了 2 天时间才理解,所以我决定这样做
首先我们制作渐变变量,它具有window
中每个像素的颜色然后我们制作 start_rgb 和 end_rgb 变量
然后我们遍历 window 中的每个像素并使 dist 变量成为
我们制作了 r、g 和 b 变量,这里我们有三个映射函数:
map(lambda _a: max(0, _a - (255 * dist)), start_rgb)
在这里,我们遍历 start_rgb 中的每个元素并减去 255(pygame 中的最大颜色值)* dist,这将在开始时为 0,在结束时为 1。我们使用 max 函数,这样如果数字小于零,它将被设置为零
map(lambda _b: _b * dist, end_rgb)
这里我们遍历 end_rgb 中的每个元素并将其乘以 dist
map(lambda start, end: start + end, map(...), map(...))
这里我们只是把我讲的第一个map函数和我讲的第二个map函数得到的结果相加
然后,这里:gradient[x][y] = r, g, b
我们将 x,y 中的像素设置为我们刚刚计算的颜色
这是您应该从这段代码中得到的结果 result