如何实现基于可变分段数的色轮均匀色相纯色分段?
实现径向纯色分段的均匀色相分布
嘿,这个需求很好搞定!要把原本连续渐变的径向色相改成固定分段的纯色块,核心就是把连续的角度值映射到离散的分段索引,再把索引转换成对应的色相。下面是具体的实现思路和代码:
核心思路
- 定义一个可配置的分段数量(比如12),我们把它作为变量
num_segments,方便随时调整。 - 计算每个像素相对于图片中心的弧度角度,把角度范围从
[-π, π]转换为[0, 2π],这样更方便计算分段。 - 根据角度占整个圆周的比例,计算当前像素属于第几个分段,得到离散的分段索引。
- 把分段索引映射为色相值(色相范围是0到1),每个分段对应一个固定的色相,这样就能生成纯色的分段效果。
修改后的完整代码
from PIL import Image import colorsys import math if __name__ == "__main__": # 可自定义的分段数量,这里设为12段 num_segments = 12 im_size = 250 im = Image.new("RGB", (im_size, im_size)) cx, cy = im_size / 2, im_size / 2 pix = im.load() for x in range(im.width): for y in range(im.height): rx = x - cx ry = y - cy # 计算当前点相对于中心的弧度角度(范围:-π 到 π) angle = math.atan2(ry, rx) # 将角度转换为 0 到 2π 的范围,方便后续计算分段 if angle < 0: angle += 2 * math.pi # 计算当前角度所属的分段索引(从0开始) segment_index = int((angle / (2 * math.pi)) * num_segments) # 将分段索引映射为色相值(色相范围0-1) h = segment_index / num_segments # 转换为RGB颜色,饱和度和亮度设为1,保证颜色鲜艳饱和 rgb = colorsys.hsv_to_rgb(h, 1.0, 1.0) # 转换为0-255的整数格式,设置像素颜色 pix[x, y] = tuple([int(round(c * 255.0)) for c in rgb]) im.show()
关键代码解释
- 角度转换:
math.atan2(ry, rx)返回的角度范围是-π到π,我们把负角度加上2π,转换成0到2π的范围,这样计算分段时不会出现负数问题。 - 分段计算:
(angle / (2 * math.pi))得到当前角度占整个圆周的比例,乘以分段数量后取整,就能得到该点所属的分段索引。 - 色相映射:每个分段索引除以总段数,得到0到1之间的色相值,这样每个分段的色相是均匀分布的(比如12段的话,色相依次是0, 1/12, 2/12...11/12)。
你可以直接修改num_segments的值来调整分段数量,比如改成6、8或者24,都能得到对应的均匀纯色分段效果。
内容的提问来源于stack exchange,提问作者Ob1Bob
相关产品推荐
相关产品推荐

