跳到主内容
UniKit

图片主色调提取

用简化 k-means(k=5)在缩小后的画布上提取图片主色调,显示每个颜色的占比与 HEX/RGB,可复制 CSS 变量或下载调色板图片。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

图片只在浏览器本地处理,不会上传

采样时先把图片缩到 100×100,再用 k-means 迭代 10 次聚类,结果可复现。

先选择一张图片

CSS 变量

选择图片后,这里会给出主色调、占比与 CSS 变量。

这个工具能做什么

  • 从截图或海报里提炼配色:k-means 聚成 3/5/8 个主色,按占比排序,一眼看出画面的主要色调。
  • 把主色直接搬进设计系统:一键复制 CSS 变量(--color-1: #RRGGBB;)粘贴到样式表里。
  • 做品牌色调研时下载调色板 PNG,色条宽度按占比分配,可以放进汇报文档当参考图。
  • 给前端项目挑占位色、骨架屏颜色、图表配色:先用真实图片提取,比凭感觉选更协调。

示例

输入

一张只有两种颜色的图片:8 个纯红像素(#FF0000)+ 4 个纯蓝像素(#0000FF)

输出

--color-1: #FF0000;  // 占比 66.7%
--color-2: #0000FF;  // 占比 33.3%

这是纯逻辑层的真实结果:k=2、迭代 10 次、固定种子 42,所以同样的像素输入每次都会得到同样的颜色与占比。界面默认 k=5 并先把图片缩到 100×100 再采样,颜色数量和采样尺寸都会影响最终结果。

常见问题

为什么每次提取的配色都一样,换个工具却不同?

因为这里用固定种子(42)的 k-means++ 初始化,结果可复现;很多工具用随机初始化,同一张图跑两次可能给出不同的簇。代价是极端情况下固定种子可能落在不太理想的初始点上,想要别的结果可以换颜色数量(3/5/8)再试。

为什么透明区域不参与统计?

采样时 alpha 低于 128 的像素会被跳过,否则透明区域的 RGB 值(通常是 0,0,0)会把主色带偏。如果整张图都是透明像素,工具会提示「没有不透明像素,无法提取主色调」。

提取出来的颜色是图片里真实存在的颜色吗?

不完全是。每个簇的最终颜色是该簇所有像素的算术平均,所以可能是一个「介于两者之间」的颜色;同色像素足够多时(比如纯色块)就正好等于原色。想要像素级精确的某个颜色,请用图片取色器。

调色板里的占比之和为什么不是 100%?

占比按「落到该簇的不透明像素数 ÷ 有效像素总数」计算并四舍五入到 0.1%,所以显示值的和可能有零点几的偏差。空簇会被直接丢弃,因此实际返回的颜色数可能少于设定的 k(例如图片本身只有两种颜色时)。

图片会被上传吗?

不会。缩放、采样与聚类都在浏览器里用 canvas 和纯 JavaScript 完成,页面没有任何上传接口,图片内容也不会被保存。

关键词:主色调配色提取dominant colorscolor palettek-means调色板取色css 变量

同类工具