# 拼豆底稿生成器 (Perler Beads Generator) 一个基于 Web 的工具,可以将普通图片转换为适配特定拼豆调色板的像素画图纸。用户可以上传图片,调整像素化粒度、颜色合并阈值,选择预设色板,排除特定颜色,预览效果,并下载带有颜色编码的图纸和用量统计图。 ## 功能特点 * **图片上传**: 支持拖放或点击选择 JPG/PNG 图片。 * **智能像素化**: * **可调粒度**: 通过滑块控制像素画的横向格子数量。 * **颜色合并**: 通过滑块调整相似颜色的合并阈值,平滑色块区域。 * **多色板支持**: * 提供多种预设拼豆色板 (如 168色, 144色, 96色等) 可供选择。 * 根据所选色板进行颜色映射。 * **颜色排除与管理**: * 在颜色统计列表中点击可**排除/恢复**特定颜色。 * 排除颜色后,原使用该颜色的区域将智能重映射到邻近的可用颜色。 * 提供一键恢复所有排除颜色的功能。 * **实时预览**: * 即时显示处理后的像素画预览。 * **悬停/长按交互**: 在预览图上悬停(桌面)或长按(移动)可查看对应单元格的颜色编码 (Key) 和颜色。 * 自动识别并标记外部背景区域(预览时显示为浅灰色)。 * **下载成品**: * **带 Key 图纸**: 下载带有清晰颜色编码 (Key) 和网格线的 PNG 图纸,忽略外部背景。 * **颜色统计图**: 下载包含各颜色 Key、色块、所需数量的 PNG 统计图。 ## 技术实现 * **框架**: [Next.js](https://nextjs.org/) (React) 与 TypeScript * **样式**: [Tailwind CSS](https://tailwindcss.com/) 用于响应式布局和样式。 * **核心逻辑**: 浏览器端 [Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API) 用于图像处理、颜色分析和绘制。 * **状态管理**: React Hooks (`useState`, `useRef`, `useEffect`, `useMemo`)。 ### 核心算法:像素化、颜色映射与优化 应用程序的核心是将图像转换为像素网格,并将颜色精确映射到有限的拼豆调色板,同时进行平滑和背景处理。 1. **图像加载与网格划分**: * 加载用户上传的图片。 * 根据用户选择的"粒度"(`granularity`, N) 和原图宽高比确定 `N x M` 的网格尺寸。 2. **初始颜色映射 (基于主导色)**: * 遍历 `N x M` 网格。 * 对每个单元格,在原图对应区域内找出出现频率最高的**像素 RGB 值 (Dominant Color)**(忽略透明/半透明像素)。 * 使用**欧氏距离**在 RGB 空间中,将该主导色映射到**当前选定且未被排除**的调色板 (`activeBeadPalette`) 中最接近的颜色。 * 记录每个单元格的初始映射色号和颜色 (`initialMappedData`)。 3. **区域颜色合并 (基于相似度)**: * 使用**广度优先搜索 (BFS)** 遍历 `initialMappedData`。 * 识别颜色相似(欧氏距离小于 `similarityThreshold`)的**连通区域**。 * 找出每个区域内出现次数最多的**珠子色号**。 * 将该区域内所有单元格统一设置为这个主导色号对应的颜色,得到初步平滑结果 (`mergedData`)。 4. **背景移除 (基于边界填充)**: * 定义一组背景色号 (`BACKGROUND_COLOR_KEYS`, 如 T1, H1)。 * 从 `mergedData` 的**所有边界单元格**开始,使用**洪水填充 (Flood Fill)** 算法。 * 标记所有从边界开始、颜色属于 `BACKGROUND_COLOR_KEYS` 且相互连通的单元格为"外部背景" (`isExternal = true`)。 5. **颜色排除与重映射**: * 当用户排除某个颜色 `key` 时: * 确定一个**重映射目标调色板**:包含网格中**最初存在**的、且**当前未被排除**的所有颜色。 * 如果目标调色板为空(表示排除此颜色会导致没有有效颜色可用),则阻止排除。 * 否则,将 `mappedPixelData` 中所有使用 `key` 的非外部单元格,重新映射到目标调色板中的**最近似**颜色。 * 当用户恢复颜色时,触发完整的图像重新处理流程(步骤 1-4)。 6. **生成预览图与下载文件**: * **预览图**: 在 Canvas 上绘制 `mergedData`,根据 `isExternal` 状态区分内部颜色和外部背景(浅灰),并添加网格线。支持悬停/长按显示色号。 * **带 Key 图纸下载**: 创建临时 Canvas,绘制 `mergedData` 中非外部背景的单元格,填充颜色、绘制边框,并在中央标注颜色 Key。 * **统计图下载**: 统计 `mergedData` 中非外部背景单元格的各色号数量,生成包含色块、色号、数量的列表式 PNG 图片。 ### 调色板数据 预设的拼豆调色板数据定义在 `src/app/beadPaletteData.json` 文件中。不同的色板组合 (如 168色、96色等) 在 `src/app/page.tsx` 的 `paletteOptions` 中定义。 ## 本地开发 1. 克隆项目: ```bash git clone https://github.com/Zippland/perler-beads.git cd perler-beads ``` 2. 安装依赖: ```bash npm install # or yarn install or pnpm install ``` 3. 启动开发服务器: ```bash npm run dev # or yarn dev or pnpm dev ``` 4. 在浏览器中打开 `http://localhost:3000`。 ## 部署 该项目可以轻松部署到 [Vercel](https://vercel.com/) 等支持 Next.js 的平台。 ## 未来可能的改进 * **颜色映射算法**: 探索如 K-Means 聚类或使用 CIEDE2000 (Delta E) 颜色距离进行映射,可能获得更优的视觉效果(但计算成本更高)。 * **抖动 (Dithering)**: 添加抖动选项(如 Floyd-Steinberg),在有限调色板下模拟更丰富的颜色过渡。 * **性能优化**: 对非常大的图片或高粒度设置,考虑使用 Web Workers 进行后台计算。 * **用户自定义调色板**: 允许用户上传或创建自己的调色板。 * **UI/UX 增强**: 如更直观的区域选择、颜色替换工具等。 ## 许可证 Apache 2.0