2024-09-30 20:33:04 发布
网友
在Android中,我使用以下代码生成我需要的渐变背景:
<gradient android:angle="90" android:startColor="#40000000" android:endColor="#00000000" android:type="linear" />
背景从上到下从亮到暗。我想知道如何用PIL在Python中实现同样的效果,因为我需要在另一个用Python编写的程序上使用相同的效果。在
以下是详细说明的技巧。你需要两层,每种颜色一层。然后使每个层的透明度在顶层增加,在底层降低。对于额外的作业,你可以将透明度改为对数递增,而不是线性。玩得开心点。在
这里有一些东西,展示了绘制多色矩形水平和垂直渐变的方法。在
from PIL import Image, ImageDraw BLACK, DARKGRAY, GRAY = ((0,0,0), (63,63,63), (127,127,127)) LIGHTGRAY, WHITE = ((191,191,191), (255,255,255)) BLUE, GREEN, RED = ((0, 0, 255), (0, 255, 0), (255, 0, 0)) class Point(object): def __init__(self, x, y): self.x, self.y = x, y @staticmethod def from_point(other): return Point(other.x, other.y) class Rect(object): def __init__(self, x1, y1, x2, y2): minx, maxx = (x1,x2) if x1 < x2 else (x2,x1) miny, maxy = (y1,y2) if y1 < y2 else (y2,y1) self.min = Point(minx, miny) self.max = Point(maxx, maxy) @staticmethod def from_points(p1, p2): return Rect(p1.x, p1.y, p2.x, p2.y) def __str__(self): return 'Rect({:d}, {:d}, {:d}, {:d})'.format(self.min.x, self.min.y, self.max.x, self.max.x) width = property(lambda self: self.max.x - self.min.x) height = property(lambda self: self.max.y - self.min.y) def gradient_color(minval, maxval, val, color_palette): """ Computes intermediate RGB color of a value in the range of minval to maxval (inclusive) based on a color_palette representing the range. """ max_index = len(color_palette)-1 v = float(val-minval) / float(maxval-minval) * max_index i1, i2 = int(v), min(int(v)+1, max_index) (r1, g1, b1), (r2, g2, b2) = color_palette[i1], color_palette[i2] f = v - i1 return int(r1 + f*(r2-r1)), int(g1 + f*(g2-g1)), int(b1 + f*(b2-b1)) def horz_gradient(draw, rect, color_func, color_palette): minval, maxval = 1, len(color_palette) delta = maxval - minval for x in range(rect.min.x, rect.max.x+1): f = (x - rect.min.x) / float(rect.width) val = minval + f * delta color = color_func(minval, maxval, val, color_palette) draw.line([(x, rect.min.y), (x, rect.max.y)], fill=color) def vert_gradient(draw, rect, color_func, color_palette): minval, maxval = 1, len(color_palette) delta = maxval - minval for y in range(rect.min.y, rect.max.y+1): f = (y - rect.min.y) / float(rect.height) val = minval + f * delta color = color_func(minval, maxval, val, color_palette) draw.line([(rect.min.x, y), (rect.max.x, y)], fill=color) color_palette = [BLUE, GREEN, RED] region = Rect(0, 0, 730, 350) imgx, imgy = region.max.x+1, region.max.y+1 image = Image.new("RGB", (imgx, imgy), WHITE) draw = ImageDraw.Draw(image) vert_gradient(draw, region, gradient_color, color_palette) image.show() #image.save("vert_gradient.png", "PNG") #print 'image saved'
并显示图像:
这将在RGB颜色空间中插入中间颜色,但也可以使用其他颜色空间-有关示例,请参阅我对问题Range values to pseudocolor的回答。在
这可以很容易地扩展到生成ARGB(Alpha+RGB)图像。在
以下是详细说明的技巧。你需要两层,每种颜色一层。然后使每个层的透明度在顶层增加,在底层降低。对于额外的作业,你可以将透明度改为对数递增,而不是线性。玩得开心点。在
这里有一些东西,展示了绘制多色矩形水平和垂直渐变的方法。在
并显示图像:
这将在RGB颜色空间中插入中间颜色,但也可以使用其他颜色空间-有关示例,请参阅我对问题Range values to pseudocolor的回答。在
这可以很容易地扩展到生成ARGB(Alpha+RGB)图像。在
相关问题 更多 >
编程相关推荐