FAST Colors 1.x 中的 PixelBox.modifiedMedianCut:改良中值切分量化算法的 API 深度解析
前端UI组件【免费下载链接】fastThe adaptive interface system for modern web experiences.项目地址https://gitcode.com/gh_mirrors/fa/fast点击查看免费下载本文围绕microsoft/fast-colorsFAST 1.x 版本的 API 文档页 PixelBox.modifiedMedianCut 展开系统讲解这一属性背后的“改良中值切分”Modified Median Cut颜色量化算法它如何把 RGB 颜色区间切分为两个更小的PixelBox、为什么它不直接在中位数处下刀以及该属性在整个quantize()量化流水线中的位置与配套配置项QuantizeConfig、Histogram、QuantizedColor等帮助读者理解从像素图像中提取小调色板的完整技术链路。1. 这个 API 在 FAST 1.x 颜色工具中的定位microsoft/fast-colors是 FAST 1.x 时代的颜色计算库官方 API 文档索引页 fast-colors.md 中列出了它的全部公开成员颜色模型类ColorRGBA64、ColorHSL、ColorHSV、ColorLAB、ColorLCH、ColorXYZ、调色板生成类ColorPalette、ComponentStateColorPalette、色彩空间转换与插值函数以及一组图像颜色量化相关的类型Histogram、PixelBlob、ImageDataPixelBlob、PixelBox、quantize()、quantizeHistogram()、QuantizeConfig和QuantizedColor。PixelBox.modifiedMedianCut属于这条量化流水线中的核心环节。它的完整 API 页面位于 sites/website/src/docs/1.x/api/fast-colors.pixelbox.modifiedmediancut.md页面标注该文件由 API Documenter 自动生成对应包microsoft/fast-colors。需要说明的是当前仓库快照的packages/目录下仅包含fast-element、fast-router、fast-test-harness三个包fast-colors 的源码并不在其中因此本文的技术细节均以该仓库中的 1.x API 文档为事实依据不再引用具体源码文件行号。2. 量化流水线总览从 PixelBlob 到 QuantizedColor要理解modifiedMedianCut先要理解它所在的调用链。根据 quantize() 函数文档入口 API 为export declare function quantize(source: PixelBlob, config?: QuantizeConfig): QuantizedColor[];其官方描述为“The image stored in the source PixelBlob is reduced down to a small set of colors”把源PixelBlob中存储的图像压缩为少量颜色并注明其算法源自 leptonica 项目的 Modified Median Cut Quantization 实现。流水线的逻辑结构如下PixelBlob像素数据的抽象接口见 fast-colors.pixelblob.md提供width、height、totalPixels以及getPixel()/getPixelRGBA()读取能力。文档中的ImageDataPixelBlob类就是它在浏览器ImageData对象上的实现配合loadImageData(source)函数可从图片 URL 加载像素数据。HistogramHistogram 文档 说明它“对每种可能的颜色统计源图像中有多少像素与之匹配”。构造器签名为(source, significantBits, pixelSkipping, isHistogramPixelValid)。当significantBits 8时每个颜色通道先被压缩到指定位数再计数——默认 5 位时8 位/通道0-255被降为 0-31原本不同的颜色会被合并计数。这大幅缩小了直方图规模也决定了量化的精度上限。PixelBoxRGB 颜色空间中的一个长方体区间见下文第 3 节modifiedMedianCut就是作用在它身上的切分方法。QuantizedColor量化输出的单个结果接口定义见 fast-colors.quantizedcolor.mdexport interface QuantizedColor包含三个属性colorColorRGBA64最终选出的代表色、colorVolume该区间覆盖的颜色体积与pixelCount落在该区间内的像素数。quantize()的返回值即QuantizedColor[]也就是最终的小调色板。3. PixelBox 类与 modifiedMedianCut 属性的完整定义PixelBox类用于“表示 RGB 颜色空间中的一个范围”Represents a range of colors in RGB color space见 fast-colors.pixelbox.md。其构造器签名如下见 constructor 文档constructor(globalHistogram: Histogram, minRed: number, maxRed: number, minGreen: number, maxGreen: number, minBlue: number, maxBlue: number);即一个PixelBox由六个边界值三通道各自的 min/max加上一个全局Histogram引用构成Histogram用于后续统计落在区间内的像素数量。PixelBox的完整属性列表继承自原文档的属性表为属性类型说明averageColorColorRGBA64区间内的平均颜色通常作为该 box 的代表色输出colorVolumenumber区间在颜色空间中的体积三通道 range 之积globalHistogramHistogram所属的全局直方图引用minRed/maxRed、minGreen/maxGreen、minBlue/maxBluenumberRGB 三通道边界modifiedMedianCut() [PixelBox \| null, PixelBox \| null]本文主题见下节pixelCountnumberreadonly落在区间内的像素数rangeRed/rangeGreen/rangeBluenumber各通道的跨度即 max − min而modifiedMedianCut属性在原文档中的完整描述与签名如下这也是本文的核心内容Attempts to divide the range of colors represented by this PixelBox into two smaller PixelBox objects. This does not actually cut directly at the median, rather it finds the median then cuts halfway through the larger box on either side of that median. The result is that small areas of color are better represented in the final output. Based on the Modified Median Cut Quantization implementation from https://github.com/DanBloomberg/leptonica/blob/master/src/colorquant2.c签名modifiedMedianCut: () [PixelBox | null, PixelBox | null];逐句拆解这段官方说明目标把当前PixelBox代表的颜色范围切分为两个更小的PixelBox。关键区别它“并不是直接在中位数处下刀”does not actually cut directly at the median。经典的中值切分Median Cut86 年经典调色板算法是在最长通道的中位数值处一分为二而改良版是先找到中位数再在中位数两侧的“较大一侧”的中点位置切分。效果“small areas of color are better represented in the final output”——少量像素占据的小颜色区域在最终输出中得到更好的保留即小面积的对比色不容易被大区域“吞并”。算法出处基于 leptonica 项目中colorquant2.c的 Modified Median Cut Quantization 实现该外链在原文档中作为算法溯源给出本文不展开外部链接。返回类型[PixelBox | null, PixelBox | null]的两个null值得注意它表明切分是一个“尝试”Attempts to divide——当区间已经切不出两个有效子 box 时例如区间过窄、像素不足、被QuantizeConfig.isBoxValid谓词判定无效对应位置会返回null调用方需自行处理无法继续切分的情况。4. 算法行为解析为什么要“在较大侧的中点切”从官方描述可以还原出这个算法与经典中值切分的差异及动机经典中值切分统计 box 内所有像素找出直方图意义上的中位数然后直接在中位数处切开。问题在于如果某个 box 内绝大多数像素聚在一端比如 95% 的像素在深色端、5% 在浅色端中位数会非常贴近少数派那一侧一刀下去少数派那一小簇颜色可能被压成极薄的区间最终在输出调色板中丢失或者与多数派合并成同一色。改良中值切分本属性的行为先计算中位数位置在像素分布上而非简单的几何中心比较中位数两侧两个子区间的“大小”结合colorVolume颜色体积与像素分布来衡量在较大一侧的中点处下刀而不是在中位数处下刀。这样做的直接后果是少数派一侧小面积颜色区域保留了相对完整的区间宽度得以在后续迭代中作为一个独立的PixelBox存活并进入最终调色板。官方说明中“The result is that small areas of color are better represented in the final output”正是对这一设计目标的总结。对于图像配色提取这类应用场景图像中大面积背景 小面积强调色/文字色该策略能让小面积的强对比颜色进入输出调色板而不是被背景色淹没。切分维度与终止条件从PixelBox暴露的rangeRed、rangeGreen、rangeBlue与colorVolume属性可以推断文档未显式说明切轴选择规则此处为基于 API 结构的合理推断切分时需要在三个通道跨度中选择下刀轴当某 box 的各通道范围已小、或pixelCount不足以支撑再次切分时modifiedMedianCut会通过返回null表明无法继续切分从而终止该分支的递归。5. 在 quantize() 流程中的角色与 QuantizeConfig 配套参数modifiedMedianCut并不建议用户直接调用——它是quantize()内部反复执行的切分原语初始的大 box 被不断切分直到达到目标调色板大小或无法再切。整个过程的约束由 QuantizeConfig 控制其全部字段继承自原文档属性表如下字段类型作用fractionByPopulationnumber对于最终大小为targetPaletteSize的调色板前fractionByPopulation * targetPaletteSize个颜色**仅按 population像素数**排序选取其余颜色按population * colorVolume排序。这让小面积高对比色能进入最终输出——与modifiedMedianCut的“小区域更好保留”设计相互呼应isBoxValid((box: PixelBox) boolean) \| null谓词用于筛掉不希望进入最终输出的 box例如剔除pixelCount低于某阈值的 boxisHistogramPixelValid((pixel: number[]) boolean) \| null谓词在直方图构建阶段剔除特定像素参数为[0,255]范围的 RGBA 四元组。例如排除接近纯白或透明的颜色maxIterationsnumber迭代上限超过则中止并返回当前结果仅在奇怪的极端输入下触发pixelSkippingnumber像素采样步长。调小会增加 CPU 负担但纳入更多像素参与计算significantBitsnumber取值范围[1,8]。内存占用按4 * 2^(3*significantBits)增长设为 8 时需要约 64 MB 的直方图targetPaletteSizenumber期望的输出调色板大小颜色极少的图像等边缘情况下实际输出可能不同另有 defaultQuantizeConfig 变量 提供默认配置quantize(source)不传config参数时即使用它。一个典型的使用形态按 API 文档描述的签名拼出的调用方式import { ImageDataPixelBlob, loadImageData, quantize, defaultQuantizeConfig, } from microsoft/fast-colors; // loadImageData 返回 HTMLImageElement → canvas → ImageData 的像素数据 const imageData await loadImageData(photo.jpg); const blob new ImageDataPixelBlob(imageData); // 提取约 8 个主色可通过 config 覆盖默认行为 const palette quantize(blob, { ...defaultQuantizeConfig, targetPaletteSize: 8, significantBits: 5, // 例剔除像素数过少的 box防止噪点色进入调色板 isBoxValid: (box) box.pixelCount 100, // 例构建直方图时排除完全透明的像素 isHistogramPixelValid: ([r, g, b, a]) a 0, }); // palette: QuantizedColor[]每项含 color(ColorRGBA64)、colorVolume、pixelCount for (const entry of palette) { console.log(entry.color, entry.pixelCount); }其中isBoxValid直接以PixelBox为参数可读取其pixelCount、colorVolume、range*等属性说明切分流程在每次modifiedMedianCut产出子 box 后都会经过有效性谓词把关无效分支自然被丢弃与modifiedMedianCut返回null的语义一致。此外还有一个更底层的入口 quantizeHistogram(histogram, config)当需要手工构造/修改Histogram、或对同一张直方图用不同config反复量化时可以直接从直方图层面启动文档同样注明其算法基于 leptonica 的 Modified Median Cut Quantization 实现。6. 相关文档与适用边界本文全部 API 事实来源于仓库内 1.x 自动生成的 API 文档树fast-colors 索引、PixelBox、modifiedMedianCut、quantize、QuantizeConfig、Histogram、QuantizedColor、quantizeHistogram。这些文档均带有!-- Do not edit this file. It is automatically generated by API Documenter. --标记对应 FAST 1.x 时代的microsoft/fast-colors包当前仓库快照的packages/目录不包含该包源码因此无法在此给出实现级源码引用涉及内部切轴选择等细节处已明确标注为基于 API 结构的推断。使用该 API 的前提项目处于 FAST 1.x 技术栈microsoft/fast-colors及其依赖版本且量化场景运行于支持ImageData/ canvas 的浏览器环境loadImageData依赖HTMLImageElement与HTMLCanvasElement。若你的项目使用仓库中packages/fast-element下的 FAST 2.x/3.x 体系颜色处理路径已不同本文结论仅适用于 1.x 的 fast-colors API。小结PixelBox.modifiedMedianCut是microsoft/fast-colors图像量化流水线的核心切分原语它返回() [PixelBox | null, PixelBox | null]通过“先找中位数、再在中位数较大一侧的中点下刀”的改良策略让像素占比小的颜色区域在最终调色板中获得更好的表示。理解它与Histogram显著位压缩计数、QuantizeConfigfractionByPopulation、isBoxValid、significantBits等约束以及quantize()/quantizeHistogram()入口的协作关系就能完整掌握 FAST 1.x 从图像提取小调色板的整套机制也能据此调整配置来满足“保小面积强调色”“排除透明/近白像素”“控制直方图内存”等实际工程诉求。赞分享前端UI组件【免费下载链接】fastThe adaptive interface system for modern web experiences.项目地址https://gitcode.com/gh_mirrors/fa/fast点击查看免费下载相关推荐深度强化学习中的值迭代算法解析深度强化学习中的值迭代算法解析 引言 值迭代 Value Iteration 是强化学习中最基础也最重要的算法之一它基于动态规划原理用于在马尔可夫决策过程文档教程人工智能深度学习NLP计算机视觉强化学习iina-plus高级技巧自定义弹幕样式、速度与过滤规则打造专属观影体验iina plus高级技巧自定义弹幕样式、速度与过滤规则打造专属观影体验 iina plus作为iina的增强版扩展专注于提供强大的弹幕支持功能。通过自定regnetx_002.pycls_in1k模型部署教程从环境配置到NPU加速regnetx_002.pycls_in1k模型部署教程从环境配置到NPU加速 regnetx_002.pycls_in1k是一款轻量级图像分类模型适用于边上一篇Awesome Cheatsheet开发者必备的终极速查表宝库下一篇推荐一款小巧强大的文本编辑器Kilo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

团队 Git 规范落地指南:分支、提交与协作避坑

团队 Git 规范落地指南:分支、提交与协作避坑

简介:Git团队开发规范文档面向新入职开发人员及需要统一Git操作流程的协作团队,系统梳理了master主干、developer开发分支、feature功能分支、bugfix修复分支的命名规则与使用场景,强调所有开发须从主干创建新分支、完成后合并回主干的协作流…

2026/9/25 2:13:58 阅读更多 →
Ocelot WebSockets 代理实战指南:从基础配置、SignalR 到自定义缓冲中间件

Ocelot WebSockets 代理实战指南:从基础配置、SignalR 到自定义缓冲中间件

API网关后端微服务 【免费下载链接】Ocelot .NET API Gateway 项目地址: https://gitcode.com/gh_mirrors/oc/Ocelot 点击查看 免费下载 导读 本文是 Ocelot(.NET API Gateway)官方文档 docs/features/websockets.rst 的深度实战解读&#…

2026/9/25 2:13:58 阅读更多 →
React 拖拽实战指南:beautiful-react-hooks 中 useDrag 的用法、自定义拖拽图像与数据传递

React 拖拽实战指南:beautiful-react-hooks 中 useDrag 的用法、自定义拖拽图像与数据传递

前端开发工具 【免费下载链接】beautiful-react-hooks 🔥 A collection of beautiful and (hopefully) useful React hooks to speed-up your components and hooks development 🔥 项目地址: https://gitcode.com/gh_mirrors/be/beautiful-r…

2026/9/25 2:13:58 阅读更多 →

最新新闻

心脏病数据分析系统:Java全栈实战拆解与重难点解析

心脏病数据分析系统:Java全栈实战拆解与重难点解析

心脏病数据分析系统这类项目,本质上是一个典型的 Java 全栈实战案例,但又不完全是“增删改查脚手架”。它真正的技术含量集中在统计聚合、关联分析、可视化报表和医疗数据的处理细节上。如果你是因为找毕设参考、做技术练手、或者想转行医疗信息化方向而…

2026/9/26 7:59:06 阅读更多 →
一次推送跑完 3 个阶段:Baserow CI/CD 流水线与 Docker 镜像构建拆解

一次推送跑完 3 个阶段:Baserow CI/CD 流水线与 Docker 镜像构建拆解

一次推送跑完 3 个阶段:Baserow CI/CD 流水线与 Docker 镜像构建拆解 【免费下载链接】baserow Build databases, automations, apps & agents with AI — no code. Open source platform available on cloud and self-hosted. GDPR, HIPAA, SOC 2 compliant. B…

2026/9/26 7:59:06 阅读更多 →
物联网无线收发芯片选型指南:Sub-1G与2.4G方案对比及实战避坑

物联网无线收发芯片选型指南:Sub-1G与2.4G方案对比及实战避坑

1. 物联网无线收发芯片的底层逻辑与方案选型思路搞物联网硬件的人都有一个共识:有线方案再稳,也架不住场景碎片化。你不可能给每台共享单车拉根网线,也不可能给农田里的土壤传感器铺光纤。无线收发芯片就是解决“最后一百米”甚至“最后十公里…

2026/9/26 7:59:06 阅读更多 →
Win11共享打印句柄无效(0x00000012)故障深度解析

Win11共享打印句柄无效(0x00000012)故障深度解析

1. 这不是蓝屏,但比蓝屏更让人抓狂:一句“句柄无效”如何瘫痪整个办公室打印链2026年9月某个周一上午9:17,行政部小张刚把季度报表发到共享打印机队列,屏幕右下角突然弹出红色警告框:“操作失败:句柄无效&a…

2026/9/26 7:59:06 阅读更多 →
Twig `is odd` 奇偶测试:语法、源码实现与沙箱安全用法详解

Twig `is odd` 奇偶测试:语法、源码实现与沙箱安全用法详解

后端 【免费下载链接】Twig Twig, the flexible, fast, and secure template language for PHP 项目地址: https://gitcode.com/gh_mirrors/tw/Twig 点击查看 免费下载 导读 odd 是 Twig 模板语言内置的一个数值测试(test),用于…

2026/9/26 7:59:06 阅读更多 →
基于UniApp与Spring Boot的微信小程序问卷系统设计与实践

基于UniApp与Spring Boot的微信小程序问卷系统设计与实践

1. 项目背景与技术选型1.1 为什么会做一套小程序问卷系统去年接了一个企业内部的满意度调研需求,原本对方想用现成的第三方问卷平台,但聊下来发现几个问题:一是内部数据不能走外部服务,二是问卷题型比较特殊,需要嵌套逻…

2026/9/26 7:58:05 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →