diff --git a/.github/workflows/build-mac.yml b/.github/workflows/build-mac.yml index 63c64379953406cda444c4f740fe22db2a8575a3..6cf2794f19960c53c7ffebcd9aab7cccada574e7 100644 --- a/.github/workflows/build-mac.yml +++ b/.github/workflows/build-mac.yml @@ -119,14 +119,11 @@ jobs: - name: Create DMG run: | - # 创建临时目录结构 mkdir -p dist/dmg/ColorCard.app/Contents/MacOS mkdir -p dist/dmg/ColorCard.app/Contents/Resources - # 复制可执行文件 cp dist/ColorCard dist/dmg/ColorCard.app/Contents/MacOS/ - # 创建 Info.plist cat > dist/dmg/ColorCard.app/Contents/Info.plist << EOF @@ -152,22 +149,18 @@ jobs: EOF - # 创建 DMG - hdiutil create -volname "ColorCard" -srcfolder dist/dmg -ov -format UDZO dist/ColorCard-${{ steps.version.outputs.version }}-macOS.dmg + hdiutil create -volname "ColorCard" -srcfolder dist/dmg -ov -format UDZO dist/Color_Card_${{ steps.version.outputs.version }}_mac.dmg - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ColorCard-macOS - path: | - dist/ColorCard-*.dmg - dist/ColorCard + path: dist/Color_Card_*_mac.dmg - name: Upload Release Asset if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: - files: | - dist/ColorCard-*.dmg + files: dist/Color_Card_*_mac.dmg env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index bb21727e99703641bf5ab931bc2c6240e1d22f7d..5be2d4008eeb9f194c40581c9bf39e64f3082dab 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -2,7 +2,7 @@ name: Deploy GitHub Pages on: push: - branches: [ main, master, Dev ] + branches: [ master] workflow_dispatch: permissions: diff --git a/.gitignore b/.gitignore index fc80f5fe3c6f28af8bb79755426752daa996cb86..685c1451fb46834c29e20902e806705f994743fa 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,8 @@ website/Thumbs.db 文档/著作权登记计划.md /宣传图 文档/1.4.0 更新内容.txt +文档/更新内容.txt +生成源代码文档.py +生成源代码文档_v2.py +/著作权材料 +文档/文档鉴别材料准备计划.md diff --git a/core/histogram_service.py b/core/histogram_service.py index e88cb092d1027f730b64c164975c2bef3a2f9c30..7aa99d5d54daafae2ade2dbd834288ffceb9f666 100644 --- a/core/histogram_service.py +++ b/core/histogram_service.py @@ -192,19 +192,29 @@ class HistogramService(QObject): self._rgb_calculator: Optional[HistogramCalculator] = None self._hue_calculator: Optional[HistogramCalculator] = None self._pending_image: Optional[QImage] = None - self._delay_timer: Optional[QTimer] = None self._use_cache = use_cache self._current_image_key: str = "" self._colorspace_info: Optional[ColorSpaceInfo] = None self._gamma: float = 2.2 + + self._luminance_delay_timer: Optional[QTimer] = None + self._rgb_delay_timer: Optional[QTimer] = None + self._hue_delay_timer: Optional[QTimer] = None + + self._pending_cleanup: List[HistogramCalculator] = [] + self._cleanup_timer: Optional[QTimer] = None def __del__(self): """析构函数:确保所有线程在对象销毁前停止""" self.cancel_all() - # 等待所有线程完全结束 + + for calculator in self._pending_cleanup: + if calculator.isRunning(): + calculator.wait() + for calculator in [self._luminance_calculator, self._rgb_calculator, self._hue_calculator]: if calculator is not None and calculator.isRunning(): - calculator.wait(1000) # 等待最多1秒 + calculator.wait() def set_colorspace_info(self, colorspace_info: Optional[ColorSpaceInfo]) -> None: """设置色彩空间信息 @@ -266,13 +276,12 @@ class HistogramService(QObject): self.luminance_histogram_ready.emit(cached) return - # 使用延迟计算 - if self._delay_timer is None: - self._delay_timer = QTimer(self) - self._delay_timer.setSingleShot(True) - self._delay_timer.timeout.connect(self._start_luminance_calculation) + if self._luminance_delay_timer is None: + self._luminance_delay_timer = QTimer(self) + self._luminance_delay_timer.setSingleShot(True) + self._luminance_delay_timer.timeout.connect(self._start_luminance_calculation) - self._delay_timer.start(delay_ms) + self._luminance_delay_timer.start(delay_ms) def _start_luminance_calculation(self) -> None: """开始明度直方图计算""" @@ -333,13 +342,12 @@ class HistogramService(QObject): self.rgb_histogram_ready.emit(cached[0], cached[1], cached[2]) return - # 使用延迟计算 - if self._delay_timer is None: - self._delay_timer = QTimer(self) - self._delay_timer.setSingleShot(True) - self._delay_timer.timeout.connect(self._start_rgb_calculation) + if self._rgb_delay_timer is None: + self._rgb_delay_timer = QTimer(self) + self._rgb_delay_timer.setSingleShot(True) + self._rgb_delay_timer.timeout.connect(self._start_rgb_calculation) - self._delay_timer.start(delay_ms) + self._rgb_delay_timer.start(delay_ms) def _start_rgb_calculation(self) -> None: """开始RGB直方图计算""" @@ -401,13 +409,12 @@ class HistogramService(QObject): self.hue_histogram_ready.emit(cached) return - # 使用延迟计算 - if self._delay_timer is None: - self._delay_timer = QTimer(self) - self._delay_timer.setSingleShot(True) - self._delay_timer.timeout.connect(self._start_hue_calculation) + if self._hue_delay_timer is None: + self._hue_delay_timer = QTimer(self) + self._hue_delay_timer.setSingleShot(True) + self._hue_delay_timer.timeout.connect(self._start_hue_calculation) - self._delay_timer.start(delay_ms) + self._hue_delay_timer.start(delay_ms) def _start_hue_calculation(self) -> None: """开始色相直方图计算""" @@ -446,7 +453,7 @@ class HistogramService(QObject): self._hue_calculator = None def _safe_stop_calculator(self, calculator: Optional[HistogramCalculator]) -> None: - """安全地停止计算器线程(不使用terminate()) + """安全地停止计算器线程(不阻塞等待) Args: calculator: 要停止的计算器线程 @@ -454,25 +461,41 @@ class HistogramService(QObject): if calculator is None: return - # 断开所有信号连接,防止回调触发 try: calculator.finished.disconnect() - except (TypeError, RuntimeError) as e: - logger.debug(f"断开finished信号时出错: {e}") + except (TypeError, RuntimeError): + pass try: calculator.error.disconnect() - except (TypeError, RuntimeError) as e: - logger.debug(f"断开error信号时出错: {e}") + except (TypeError, RuntimeError): + pass - # 请求取消 calculator.cancel() - # 等待线程结束(增加等待时间到500ms) if calculator.isRunning(): - calculator.wait(500) - - # 注意:如果线程仍在运行,让它在后台自然结束 - # 不要强制终止,下次创建新计算器时会替换旧实例 + self._pending_cleanup.append(calculator) + self._start_cleanup_timer() + + def _start_cleanup_timer(self) -> None: + """启动清理定时器""" + if self._cleanup_timer is None: + self._cleanup_timer = QTimer(self) + self._cleanup_timer.timeout.connect(self._cleanup_pending_threads) + + if not self._cleanup_timer.isActive(): + self._cleanup_timer.start(500) + + def _cleanup_pending_threads(self) -> None: + """清理已结束的线程""" + still_running = [] + for calculator in self._pending_cleanup: + if calculator.isRunning(): + still_running.append(calculator) + + self._pending_cleanup = still_running + + if not self._pending_cleanup: + self._cleanup_timer.stop() def _cancel_luminance_calculator(self) -> None: """取消明度直方图计算""" @@ -491,11 +514,13 @@ class HistogramService(QObject): def cancel_all(self) -> None: """取消所有计算""" - # 先停止延迟计时器,防止新的计算开始 - if self._delay_timer is not None and self._delay_timer.isActive(): - self._delay_timer.stop() + if self._luminance_delay_timer is not None and self._luminance_delay_timer.isActive(): + self._luminance_delay_timer.stop() + if self._rgb_delay_timer is not None and self._rgb_delay_timer.isActive(): + self._rgb_delay_timer.stop() + if self._hue_delay_timer is not None and self._hue_delay_timer.isActive(): + self._hue_delay_timer.stop() - # 取消所有进行中的计算 self._cancel_luminance_calculator() self._cancel_rgb_calculator() self._cancel_hue_calculator() diff --git a/core/logger.py b/core/logger.py index cf6468a5feac5ad45c57f6729d08853b60633f54..73d8dc2bb59683ba39907cba86b1b741f50dedf4 100644 --- a/core/logger.py +++ b/core/logger.py @@ -1,9 +1,9 @@ # 标准库导入 import logging -import logging.handlers import sys import time from contextlib import contextmanager +from datetime import datetime, timedelta from pathlib import Path from typing import Any, Dict, Optional @@ -13,15 +13,14 @@ class LoggerManager: CONFIG_DIR_NAME: str = ".color_card" LOG_DIR_NAME: str = "logs" - LOG_FILE_NAME: str = "color_card.log" - MAX_BYTES: int = 10 * 1024 * 1024 - BACKUP_COUNT: int = 7 + LOG_RETENTION_DAYS: int = 30 def __init__(self) -> None: """初始化日志管理器""" self._log_dir: Path = self._get_log_dir() self._logger: Optional[logging.Logger] = None self._initialized: bool = False + self._current_log_file: Optional[Path] = None def _get_log_dir(self) -> Path: """获取日志目录路径 @@ -37,6 +36,30 @@ class LoggerManager: """确保日志目录存在""" self._log_dir.mkdir(parents=True, exist_ok=True) + def _generate_log_filename(self) -> str: + """生成日志文件名 + + Returns: + str: 日志文件名,格式为 Color Card_版本号_YYYYMMDD_HHMMSS.log + """ + from version import version_manager + version = version_manager.get_version() + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + return f"Color Card_{version}_{timestamp}.log" + + def _cleanup_old_logs(self) -> None: + """清理过期的日志文件""" + cutoff_time = datetime.now() - timedelta(days=self.LOG_RETENTION_DAYS) + for log_file in self._log_dir.glob("Color Card_*.log"): + if log_file == self._current_log_file: + continue + try: + file_mtime = datetime.fromtimestamp(log_file.stat().st_mtime) + if file_mtime < cutoff_time: + log_file.unlink() + except OSError: + pass + def initialize(self, level: int = logging.INFO) -> None: """初始化日志系统 @@ -53,11 +76,10 @@ class LoggerManager: self._logger.handlers.clear() - log_path = self._log_dir / self.LOG_FILE_NAME - file_handler = logging.handlers.RotatingFileHandler( - log_path, - maxBytes=self.MAX_BYTES, - backupCount=self.BACKUP_COUNT, + log_filename = self._generate_log_filename() + self._current_log_file = self._log_dir / log_filename + file_handler = logging.FileHandler( + self._current_log_file, encoding="utf-8" ) file_handler.setLevel(level) @@ -78,6 +100,8 @@ class LoggerManager: self._initialized = True self._logger.info("日志系统初始化完成") + self._cleanup_old_logs() + def get_logger(self, name: str) -> logging.Logger: """获取模块级日志记录器 @@ -97,7 +121,7 @@ class LoggerManager: Returns: Path: 日志文件路径 """ - return self._log_dir / self.LOG_FILE_NAME + return self._current_log_file or self._log_dir def get_log_dir(self) -> Path: """获取日志目录路径 diff --git a/core/luminance_service.py b/core/luminance_service.py index 2d2cfb6cc47fc052c49d3cd8e88525ed1ec4e3b4..2ebcb169cb869cfb1e0e64f90935406c3e1c45f0 100644 --- a/core/luminance_service.py +++ b/core/luminance_service.py @@ -8,7 +8,7 @@ UI层通过LuminanceService调用业务功能,实现UI与业务逻辑分离。 from typing import Dict, List, Optional, Tuple, Any # 第三方库导入 -from PySide6.QtCore import QObject, QThread, Signal, Qt +from PySide6.QtCore import QObject, QThread, Signal, Qt, QTimer from PySide6.QtGui import QColor, QImage, QPainter, QPixmap # 项目模块导入 @@ -174,12 +174,19 @@ class LuminanceService(QObject): """ super().__init__(parent) self._calculator: Optional[LuminanceCalculator] = None + + self._pending_cleanup: List[LuminanceCalculator] = [] + self._cleanup_timer: Optional[QTimer] = None def __del__(self): """析构函数:确保线程在对象销毁前停止""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() - self._calculator.wait(1000) # 等待最多1秒 + self._calculator.wait() + + for calculator in self._pending_cleanup: + if calculator.isRunning(): + calculator.wait() def calculate_luminance_zones(self, image: QImage) -> None: """开始计算明度Zone分布 @@ -190,9 +197,20 @@ class LuminanceService(QObject): Args: image: QImage 对象 """ - # 取消之前的计算 if self._calculator is not None and self._calculator.isRunning(): + try: + self._calculator.calculation_finished.disconnect() + except (TypeError, RuntimeError): + pass + try: + self._calculator.calculation_error.disconnect() + except (TypeError, RuntimeError): + pass + self._calculator.cancel() + if self._calculator.isRunning(): + self._pending_cleanup.append(self._calculator) + self._start_cleanup_timer() self._calculator = None self.calculation_started.emit() @@ -214,6 +232,31 @@ class LuminanceService(QObject): """取消当前计算任务""" if self._calculator is not None and self._calculator.isRunning(): self._calculator.cancel() + if self._calculator.isRunning(): + self._pending_cleanup.append(self._calculator) + self._start_cleanup_timer() + self._calculator = None + + def _start_cleanup_timer(self) -> None: + """启动清理定时器""" + if self._cleanup_timer is None: + self._cleanup_timer = QTimer(self) + self._cleanup_timer.timeout.connect(self._cleanup_pending_threads) + + if not self._cleanup_timer.isActive(): + self._cleanup_timer.start(500) + + def _cleanup_pending_threads(self) -> None: + """清理已结束的线程""" + still_running = [] + for calculator in self._pending_cleanup: + if calculator.isRunning(): + still_running.append(calculator) + + self._pending_cleanup = still_running + + if not self._pending_cleanup: + self._cleanup_timer.stop() def get_zone_at_position(self, image: QImage, x: int, y: int) -> str: """获取指定位置的Zone编号 @@ -352,7 +395,3 @@ class LuminanceService(QObject): if self._calculator is not None: self._calculator.deleteLater() self._calculator = None - - -# 导入Qt常量 -from PySide6.QtCore import Qt diff --git a/dialogs/edit_palette.py b/dialogs/edit_palette.py index 1f1ed4c7023c4292249389b7129464b7f3c2459c..ef8e8dd58cf71ee688fc7027c39004320fa5b012 100644 --- a/dialogs/edit_palette.py +++ b/dialogs/edit_palette.py @@ -299,7 +299,7 @@ class EditPaletteDialog(QDialog): # 添加颜色按钮 self.add_color_button = PushButton(FluentIcon.ADD, tr('dialogs.edit_palette.add_color')) self.add_color_button.setFixedHeight(32) - self.add_color_button.clicked.connect(self._on_add_color) + self.add_color_button.clicked.connect(lambda: self._on_add_color()) layout.addWidget(self.add_color_button) # 按钮区域 @@ -324,15 +324,20 @@ class EditPaletteDialog(QDialog): self.name_input.setFocus() self.name_input.selectAll() - # 添加第一个颜色输入行 - self._on_add_color() + # 添加第一个颜色输入行(不滚动) + self._on_add_color(scroll_to_bottom=False) - def _on_add_color(self): - """添加颜色输入行""" + def _on_add_color(self, scroll_to_bottom: bool = True): + """添加颜色输入行 + + Args: + scroll_to_bottom: 是否滚动到底部(默认True,初始化时传False) + """ row = ColorInputRow(len(self._color_rows), self.colors_container) self._color_rows.append(row) self.colors_layout.addWidget(row) - self._scroll_to_bottom() + if scroll_to_bottom: + self._scroll_to_bottom() def _scroll_to_bottom(self): """滚动到颜色列表底部""" diff --git a/docs/changelog.json b/docs/changelog.json index e9a542abae51cda660a14997573d46c11f74f1ca..8534c3d93cef6aed1607f6d30b6b49c7b76d3a78 100644 --- a/docs/changelog.json +++ b/docs/changelog.json @@ -1,156 +1,273 @@ { "versions": [ + { + "version": "v1.4.1", + "date": "2026-03-02", + "changes": [ + { + "category": "问题修复", + "items": [ + "修复面板切换时线程崩溃问题", + "修复编辑配色对话框初始化时自动滚动到末尾的问题", + "修复明度直方图拖动时区域指示不匹配的问题" + ] + }, + { + "category": "界面优化", + "items": [ + "统一明度遮罩颜色并优化颜色方案" + ] + }, + { + "category": "功能优化", + "items": [ + "日志系统支持每次启动创建新文件", + "优化Mac构建流程输出文件命名" + ] + } + ] + }, { "version": "v1.4.0", "date": "2026-03-01", "changes": [ - "取色卡 v1.4 更新日志", - "新增功能", - "渐变提取", - "新增渐变提取功能,支持RGB/HSB/LAB三种颜色空间的渐变插值", - "官网入口", - "新增项目官网和关于对话框官网按钮", - "版本管理", - "版本比较支持预发布版本号识别", - "日志系统", - "新增日志系统,支持问题排查、行为追踪、性能监控", - "问题修复", - "修复配色源显示逻辑,使用name字段替代中文name_zh字段", - "修复多线程和延迟加载导致的闪退问题,提升稳定性", - "修复配色管理面板编辑后页码重置问题", - "界面优化", - "更换程序 Logo", - "缩小配色管理分组下拉框宽度", - "优化主窗口启动位置为屏幕居中显示", - "优化多语言显示,精简法语和俄语翻译", - "编辑配色对话框打开默认自动滚动到底部", - "性能提升", - "优化SVG智能映射逻辑,新增覆盖检测功能", - "将直方图分区从8个改为9个,优化明度分析精度", - "内容调整", - "删除配色源名称中的「主题」和「配色」后缀", - "丰富配色预览内置SVG模板" + { + "category": "新增功能", + "items": [ + { + "title": "渐变提取", + "desc": "新增渐变提取功能,支持RGB/HSB/LAB三种颜色空间的渐变插值" + }, + { + "title": "官网入口", + "desc": "新增项目官网和关于对话框官网按钮" + }, + { + "title": "版本管理", + "desc": "版本比较支持预发布版本号识别" + }, + { + "title": "日志系统", + "desc": "新增日志系统,支持问题排查、行为追踪、性能监控" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复配色源显示逻辑,使用name字段替代中文name_zh字段", + "修复多线程和延迟加载导致的闪退问题,提升稳定性", + "修复配色管理面板编辑后页码重置问题" + ] + }, + { + "category": "界面优化", + "items": [ + "更换程序 Logo", + "缩小配色管理分组下拉框宽度", + "优化主窗口启动位置为屏幕居中显示", + "优化多语言显示,精简法语和俄语翻译", + "编辑配色对话框打开默认自动滚动到底部" + ] + }, + { + "category": "逻辑优化", + "items": [ + "优化SVG智能映射逻辑,新增覆盖检测功能", + "将直方图分区从8个改为9个,优化明度分析精度" + ] + }, + { + "category": "内容调整", + "items": [ + "删除配色源名称中的「主题」和「配色」后缀", + "丰富配色预览内置SVG模板" + ] + } ] }, { "version": "v1.3.0 Beta", "date": "2026-02-22", "changes": [ - "取色卡 v1.3.0 Beta 更新日志", - "新增功能", - "多语言支持", - "新增多语言切换功能,支持简体中文、繁體中文、English、日本語、Français、Русский 六种语言", - "在设置界面即可切换语言,实时生效", - "色彩分析增强", - "新增图片色彩空间识别与Gamma校正支持,提升颜色提取准确性", - "采样点数量上限提升至6个,可同时提取更多颜色", - "配色预览面板", - "配色预览功能全面重构,统一使用SVG格式模板", - "新增大量场景示例", - "新增色彩管理面板分组功能,便于浏览和管理配色方案", - "问题修复", - "修复色轮采样点无法到达圆周的问题,现在采样点可以正确移动到色轮边缘", - "修复RYB模式配色关系不正确的问题,配色生成结果更加准确", - "界面优化", - "调整色轮色相起始位置至12点钟方向,更符合设计习惯", - "调整主窗口最小宽度和默认宽度,优化界面布局", - "内置色彩分批加载时添加加载中过渡标识,提升加载体验", - "直方图组件添加加载中提示,大图片加载时反馈更清晰", - "优化直方图自适应缩放模式显示逻辑", - "性能提升", - "实现配色计算和直方图计算缓存机制,重复操作响应更快", - "优化直方图计算服务,缩短延迟计算时间,大图片加载性能显著提升", - "实现业务服务延迟加载,减少应用启动时间", - "实现图片内存管理和线程安全优化,运行更稳定", - "许可证完善", - "添加PyInstaller许可证到项目许可证文档,完善开源合规性" + { + "category": "新增功能", + "items": [ + { + "title": "多语言支持", + "desc": "新增多语言切换功能,支持简体中文、繁體中文、English、日本語、Français、Русский 六种语言,在设置界面即可切换语言,实时生效" + }, + { + "title": "色彩分析增强", + "desc": "新增图片色彩空间识别与Gamma校正支持,提升颜色提取准确性,采样点数量上限提升至6个,可同时提取更多颜色" + }, + { + "title": "配色预览面板", + "desc": "配色预览功能全面重构,统一使用SVG格式模板,新增大量场景示例,新增色彩管理面板分组功能,便于浏览和管理配色方案" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复色轮采样点无法到达圆周的问题,现在采样点可以正确移动到色轮边缘", + "修复RYB模式配色关系不正确的问题,配色生成结果更加准确" + ] + }, + { + "category": "界面优化", + "items": [ + "调整色轮色相起始位置至12点钟方向,更符合设计习惯", + "调整主窗口最小宽度和默认宽度,优化界面布局", + "内置色彩分批加载时添加加载中过渡标识,提升加载体验", + "直方图组件添加加载中提示,大图片加载时反馈更清晰", + "优化直方图自适应缩放模式显示逻辑" + ] + }, + { + "category": "性能提升", + "items": [ + "实现配色计算和直方图计算缓存机制,重复操作响应更快", + "优化直方图计算服务,缩短延迟计算时间,大图片加载性能显著提升", + "实现业务服务延迟加载,减少应用启动时间", + "实现图片内存管理和线程安全优化,运行更稳定" + ] + }, + { + "category": "许可证完善", + "items": [ + "添加PyInstaller许可证到项目许可证文档,完善开源合规性" + ] + } ] }, { "version": "v1.2.0", "date": "2026-02-15", "changes": [ - "取色卡 v1.2 更新日志", - "新增功能", - "色彩分析增强", - "新增色彩提取页面高饱和度/高明度区域显示功能,支持自定义阈值配置", - "RGB直方图添加通道切换按钮,支持点击按钮切换显示单通道或全通道", - "在色环周围显示色相名称标签,色彩识别更直观", - "色盲模拟预览", - "新增色盲模拟预览功能,支持多种色盲类型模拟", - "对比度检查", - "新增对比度检查功能,确保色彩组合的可读性", - "配色预览面板", - "新增配色预览面板,支持10种场景的预览", - "支持导入SVG文件预览", - "右键菜单可删除颜色和复制HEX值", - "内置色彩面板", - "新增内置色彩面板,集成大量开源配色方案", - "包含 Open Color、Nice Color Palettes、Tailwind CSS Colors 等知名配色库", - "支持配色随机模式、收藏到配色管理面板、预览功能", - "配色管理增强", - "为色卡收藏面板添加16进制颜色值编辑功能", - "新增编辑配色对话框,支持添加和编辑配色", - "启动体验优化", - "添加启动画面并优化启动时机", - "问题修复", - "修复增加色彩提取采样点数后新色卡信息不更新的问题", - "修复全屏按钮窗口状态保存与最大化混淆的问题", - "修复Win10深色模式适配问题", - "修复明度提取界面图片加载时Zone标签框未隐藏的问题", - "修复HSB色轮明度计算问题并优化配色方案随机算法", - "修复色块边框主题切换适配问题", - "修复HSB色轮在窗口调整和明度调整时的闪烁问题", - "修正所有文件中的版权和官网信息", - "修复 Logo 路径硬编码导致打包后无法显示的问题", - "移除明度面板导入图片时标题栏文件名显示", - "界面优化", - "移除收藏页面操作按钮的Tooltip", - "缩小配色生成卡片中16进制输入框与操作按钮的间距", - "调整主窗口大小", - "为图标增加圆角裁切", - "优化图标和交互体验,禁用原生右键菜单", - "性能提升", - "优化应用启动速度:色轮缓存和配色方案颜色延迟生成", - "代码重构", - "将色卡收藏面板重命名为配色管理,将配色方案面板重命名为配色生成", - "统一配色管理导入导出JSON格式", - "新增编辑配色对话框" + { + "category": "新增功能", + "items": [ + { + "title": "色彩分析增强", + "desc": "新增色彩提取页面高饱和度/高明度区域显示功能,支持自定义阈值配置,RGB直方图添加通道切换按钮,支持点击按钮切换显示单通道或全通道,在色环周围显示色相名称标签,色彩识别更直观" + }, + { + "title": "色盲模拟预览", + "desc": "新增色盲模拟预览功能,支持多种色盲类型模拟" + }, + { + "title": "对比度检查", + "desc": "新增对比度检查功能,确保色彩组合的可读性" + }, + { + "title": "配色预览面板", + "desc": "新增配色预览面板,支持10种场景的预览,支持导入SVG文件预览,右键菜单可删除颜色和复制HEX值" + }, + { + "title": "内置色彩面板", + "desc": "新增内置色彩面板,集成大量开源配色方案,包含 Open Color、Nice Color Palettes、Tailwind CSS Colors 等知名配色库,支持配色随机模式、收藏到配色管理面板、预览功能" + }, + { + "title": "配色管理增强", + "desc": "为色卡收藏面板添加16进制颜色值编辑功能,新增编辑配色对话框,支持添加和编辑配色" + }, + { + "title": "启动体验优化", + "desc": "添加启动画面并优化启动时机" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复增加色彩提取采样点数后新色卡信息不更新的问题", + "修复全屏按钮窗口状态保存与最大化混淆的问题", + "修复Win10深色模式适配问题", + "修复明度提取界面图片加载时Zone标签框未隐藏的问题", + "修复HSB色轮明度计算问题并优化配色方案随机算法", + "修复色块边框主题切换适配问题", + "修复HSB色轮在窗口调整和明度调整时的闪烁问题", + "修正所有文件中的版权和官网信息", + "修复 Logo 路径硬编码导致打包后无法显示的问题", + "移除明度面板导入图片时标题栏文件名显示" + ] + }, + { + "category": "界面优化", + "items": [ + "移除收藏页面操作按钮的Tooltip", + "缩小配色生成卡片中16进制输入框与操作按钮的间距", + "调整主窗口大小", + "为图标增加圆角裁切", + "优化图标和交互体验,禁用原生右键菜单" + ] + }, + { + "category": "性能提升", + "items": [ + "优化应用启动速度:色轮缓存和配色方案颜色延迟生成" + ] + }, + { + "category": "代码重构", + "items": [ + "将色卡收藏面板重命名为配色管理,将配色方案面板重命名为配色生成", + "统一配色管理导入导出JSON格式", + "新增编辑配色对话框" + ] + } ] }, { "version": "v1.1.0", "date": "2026-02-08", "changes": [ - "取色卡 v1.1 更新日志", - "新增功能", - "智能配色方案", - "新增配色方案功能,支持 RGB/RYB 两种色彩逻辑", - "提供 5 种专业配色算法:同色系、邻近色、互补色、分离补色、双补色", - "色卡收藏功能", - "支持色彩提取、配色方案面板的配色收藏", - "支持收藏管理,可批量导入导出", - "图片分析增强", - "集成 MMCQ 算法,自动提取图片主色调", - "直方图新增自适应缩放,支持线性和平方根两种模式切换", - "明度区域采用 Adobe 标准命名:黑色/阴影/中间调/高光/白色", - "界面体验升级", - "新增深色/浅色主题切换,优化文本对比度", - "标题栏新增全屏按钮,支持 F11 快捷键", - "重构导入图片,分阶段加载有明确的视觉反馈", - "支持拖拽图片直接导入", - "问题修复", - "修复色彩提取和明度提取面板布局重叠问题", - "修复明度直方图蓝色指示框松开后不消失的问题", - "优化异常报错过滤,减少干扰提示", - "界面优化", - "统一图片显示器、直方图、色环背景色为深灰色", - "设置界面内容重新分类,更清晰易用", - "16进制颜色值开关显示中文开/关", - "新增界面布局规范,防止组件重叠", - "性能提升", - "使用 NumPy 向量化优化明度直方图计算,响应更快", - "代码重构:统一颜色管理,消除硬编码" + { + "category": "新增功能", + "items": [ + { + "title": "智能配色方案", + "desc": "新增配色方案功能,支持 RGB/RYB 两种色彩逻辑,提供 5 种专业配色算法:同色系、邻近色、互补色、分离补色、双补色" + }, + { + "title": "色卡收藏功能", + "desc": "支持色彩提取、配色方案面板的配色收藏,支持收藏管理,可批量导入导出" + }, + { + "title": "图片分析增强", + "desc": "集成 MMCQ 算法,自动提取图片主色调,直方图新增自适应缩放,支持线性和平方根两种模式切换,明度区域采用 Adobe 标准命名:黑色/阴影/中间调/高光/白色" + }, + { + "title": "界面体验升级", + "desc": "新增深色/浅色主题切换,优化文本对比度,标题栏新增全屏按钮,支持 F11 快捷键,重构导入图片,分阶段加载有明确的视觉反馈,支持拖拽图片直接导入" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复色彩提取和明度提取面板布局重叠问题", + "修复明度直方图蓝色指示框松开后不消失的问题", + "优化异常报错过滤,减少干扰提示" + ] + }, + { + "category": "界面优化", + "items": [ + "统一图片显示器、直方图、色环背景色为深灰色", + "设置界面内容重新分类,更清晰易用", + "16进制颜色值开关显示中文开/关", + "新增界面布局规范,防止组件重叠" + ] + }, + { + "category": "性能提升", + "items": [ + "使用 NumPy 向量化优化明度直方图计算,响应更快", + "代码重构:统一颜色管理,消除硬编码" + ] + } ] } ] diff --git a/docs/index.html b/docs/index.html index ee70906f36786bc54b631290d0eaa5465dc5b1f5..86aea0c58d7331537344246614083acbd446648b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1454,31 +1454,55 @@ if (!response.ok) throw new Error('Failed to fetch'); const data = await response.json(); const versions = data.versions; - + if (versions.length === 0) { container.innerHTML = '
暂无更新记录
'; return; } - + container.innerHTML = versions.map(v => { const date = new Date(v.date).toLocaleDateString('zh-CN'); - // Support both array and string format for changes - let changesHtml; - if (Array.isArray(v.changes)) { - changesHtml = v.changes.map(c => `
  • ${c}
  • `).join(''); - } else { - // String format: split by newline and format - changesHtml = v.changes.split('\n').filter(line => line.trim()).map(c => `
  • ${c.trim()}
  • `).join(''); - } + + // 生成HTML + const changesHtml = v.changes.map(cat => { + const itemsHtml = cat.items.map(item => { + if (typeof item === 'string') { + // 普通描述项 + return `
  • ${item}
  • `; + } else if (item.title && item.desc) { + // 有子标题的项 + return ` +
  • +
    ${item.title}
    +
    ${item.desc}
    +
  • + `; + } + return ''; + }).join(''); + + return ` +
    +

    + + ${cat.category} +

    + +
    + `; + }).join(''); + return `

    ${v.version}

    ${date}
    - +
    `; }).join(''); diff --git a/ui/canvases.py b/ui/canvases.py index 9fe23fc223c31ea6c1b8664c53fb0b193b4d006f..01522960f01c1ca0dea6b9f04e022588cb8061ff 100644 --- a/ui/canvases.py +++ b/ui/canvases.py @@ -15,10 +15,12 @@ from utils import tr from .color_picker import ColorPicker from .zoom_viewer import ZoomViewer from utils.theme_colors import ( - get_canvas_background_color, get_canvas_empty_text_color, get_picker_colors, + get_canvas_background_color, get_canvas_empty_text_color, get_tooltip_bg_color, get_high_saturation_highlight_color, get_high_brightness_highlight_color, - get_high_saturation_border_color, get_high_brightness_border_color + get_high_saturation_border_color, get_high_brightness_border_color, + get_zone_mask_colors, get_zone_label_bg_color, get_zone_label_text_color, + get_zone_info_text_colors ) @@ -1217,8 +1219,8 @@ class LuminanceCanvas(BaseCanvas): self._highlighted_zone: int = -1 # 当前高亮显示的Zone (-1表示无) self._zone_highlight_pixmap: Optional[QPixmap] = None # 高亮遮罩缓存 - # Zone高亮颜色配置 (Zone 0-7) - Adobe标准映射 - self._zone_highlight_colors: List[QColor] = get_picker_colors() + # Zone高亮颜色配置 (Zone 0-8) - 按类型统一颜色 + self._zone_highlight_colors: List[QColor] = get_zone_mask_colors() # 明度服务 self._luminance_service = None @@ -1395,11 +1397,11 @@ class LuminanceCanvas(BaseCanvas): # 绘制深色填充方框 painter.setPen(Qt.PenStyle.NoPen) - painter.setBrush(QColor(40, 40, 40, 200)) + painter.setBrush(get_zone_label_bg_color()) painter.drawRect(box_x, box_y, box_width, box_height) # 绘制白色文字 - painter.setPen(QColor(255, 255, 255)) + painter.setPen(get_zone_label_text_color()) text_x = box_x + (box_width - text_width) // 2 text_y = box_y + (box_height - text_height) // 2 painter.drawText(text_x, text_y + text_height - 2, zone) @@ -1532,8 +1534,9 @@ class LuminanceCanvas(BaseCanvas): text = f"{label} ({name}) | 亮度: {lum_range}" - # 获取文字颜色 - text_color = self._zone_highlight_colors[self._highlighted_zone] + # 获取文字颜色(使用与遮罩类型对应的颜色) + info_text_colors = get_zone_info_text_colors() + text_color = info_text_colors[self._highlighted_zone] # 使用通用方法绘制信息框 self._draw_info_box(painter, text, text_color, display_rect) diff --git a/ui/histograms.py b/ui/histograms.py index e4c822f34947a654d06bbf89babd27edbef77c6b..d703329b79985d27265d3d1b992ea7e9fba03e8d 100644 --- a/ui/histograms.py +++ b/ui/histograms.py @@ -6,7 +6,7 @@ from PySide6.QtGui import QColor, QFont, QLinearGradient, QPainter, QPen, QMouse from PySide6.QtWidgets import QWidget # 项目模块导入 -from core import get_zone_bounds, HistogramService, ZONE_WIDTH +from core import HistogramService, ZONE_WIDTH from utils import tr from utils.theme_colors import ( get_histogram_background_color, get_histogram_grid_color, get_histogram_axis_color, @@ -445,8 +445,9 @@ class LuminanceHistogramWidget(BaseHistogram): zone_width = width / 9.0 for zone in self._highlight_zones: - min_lum, max_lum = get_zone_bounds(zone) - zone_index = int(min_lum / ZONE_WIDTH) + # 直接从 Zone 字符串解析索引,避免浮点数精度问题 + # Zone 格式为 "0-1", "1-2", ..., "8-9" + zone_index = int(zone.split('-')[0]) # 计算区域位置 start_x = int(x + zone_index * zone_width) diff --git a/utils/theme_colors.py b/utils/theme_colors.py index fa003a35ea2abf3adb15732fbb8067af3fd7b818..50d7137ac7dd2bd05830368afa8e90506a8c19c3 100644 --- a/utils/theme_colors.py +++ b/utils/theme_colors.py @@ -284,3 +284,70 @@ def get_high_brightness_highlight_color(): def get_high_brightness_border_color(): """获取高明度区域边框颜色""" return QColor(0, 200, 255, 150) + + +# ========== Zone遮罩颜色(按类型统一)========== +def get_zone_mask_colors(): + """获取Zone遮罩颜色列表(按类型统一颜色) + + 颜色方案: + - 黑色: 深灰色半透明 + - 阴影: 蓝色半透明 + - 中间调: 绿色半透明 + - 高光: 黄色半透明 + - 白色: 白色半透明 + """ + # 黑色 - 深蓝色 + blacks_color = QColor(0, 80, 160, 140) + # 阴影 - 蓝色 + shadows_color = QColor(0, 120, 255, 100) + # 中间调 - 绿色 + midtones_color = QColor(0, 200, 100, 100) + # 高光 - 黄色 + highlights_color = QColor(255, 200, 0, 100) + # 白色 - 深黄色 + whites_color = QColor(200, 160, 0, 140) + + return [ + blacks_color, # Zone 0: 黑色 + shadows_color, # Zone 1: 阴影 + shadows_color, # Zone 2: 阴影 + midtones_color, # Zone 3: 中间调 + midtones_color, # Zone 4: 中间调 + midtones_color, # Zone 5: 中间调 + highlights_color, # Zone 6: 高光 + highlights_color, # Zone 7: 高光 + whites_color, # Zone 8: 白色 + ] + + +def get_zone_label_bg_color(): + """获取Zone标注框背景颜色 - 统一使用深色""" + return QColor(40, 40, 40, 200) + + +def get_zone_label_text_color(): + """获取Zone标注框文字颜色 - 统一使用白色""" + return QColor(255, 255, 255) + + +def get_zone_info_text_colors(): + """获取Zone信息提示文字颜色列表(与遮罩颜色对应)""" + # 与 get_zone_mask_colors() 对应,但使用不透明颜色 + blacks_color = QColor(100, 180, 255) # 黑色区域用蓝色文字 + shadows_color = QColor(100, 180, 255) # 阴影区域用蓝色 + midtones_color = QColor(100, 255, 150) # 中间调用绿色 + highlights_color = QColor(255, 220, 100) # 高光用黄色 + whites_color = QColor(255, 200, 50) # 白色区域用深黄色 + + return [ + blacks_color, # Zone 0 + shadows_color, # Zone 1 + shadows_color, # Zone 2 + midtones_color, # Zone 3 + midtones_color, # Zone 4 + midtones_color, # Zone 5 + highlights_color, # Zone 6 + highlights_color, # Zone 7 + whites_color, # Zone 8 + ] diff --git a/version.py b/version.py index 09a926fef680cc9d13b83e96161c24a798db8642..37f392ac3b09b3b44d0fca8c328b73804ba0fb0c 100644 --- a/version.py +++ b/version.py @@ -9,7 +9,7 @@ class VersionManager: # 版本号组件 self.major: int = 1 self.minor: int = 4 - self.patch: int = 0 + self.patch: int = 1 self.build: int = 0 self.prerelease: str = "" diff --git a/version.txt b/version.txt index e21e727f96fa5a19a233d5260fd3ba4f6ed3837c..13175fdc437138f09019c0688f900c1c227be1e9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.4.0 \ No newline at end of file +1.4.1 \ No newline at end of file diff --git a/version_info.txt b/version_info.txt index e4ed43c6517350b29d08c007e3b858988b86fd4a..ac1688f269a3f30484d35a36a20c82d19a8aef34 100644 --- a/version_info.txt +++ b/version_info.txt @@ -1,7 +1,7 @@ VSVersionInfo( ffi=FixedFileInfo( - filevers=(2026,3,1,1), - prodvers=(1,4,0,0), + filevers=(2026,3,2,1), + prodvers=(1,4,1,0), mask=0x3f, flags=0x0, OS=0x4, @@ -17,12 +17,12 @@ VSVersionInfo( [ StringStruct(u'CompanyName', u'浮晓 HXiao Studio'), StringStruct(u'FileDescription', u'取色卡 - Color Card'), - StringStruct(u'FileVersion', u'1.4.0'), + StringStruct(u'FileVersion', u'1.4.1'), StringStruct(u'InternalName', u'Color_Card'), StringStruct(u'LegalCopyright', u'© 2026 浮晓 HXiao Studio'), StringStruct(u'OriginalFilename', u'Color_Card.exe'), StringStruct(u'ProductName', u'取色卡'), - StringStruct(u'ProductVersion', u'1.4.0'), + StringStruct(u'ProductVersion', u'1.4.1'), StringStruct(u'Comments', u'一站式的图片的图片分析和配色工具') ] ) diff --git a/website/index.html b/website/index.html index ee70906f36786bc54b631290d0eaa5465dc5b1f5..86aea0c58d7331537344246614083acbd446648b 100644 --- a/website/index.html +++ b/website/index.html @@ -1454,31 +1454,55 @@ if (!response.ok) throw new Error('Failed to fetch'); const data = await response.json(); const versions = data.versions; - + if (versions.length === 0) { container.innerHTML = '
    暂无更新记录
    '; return; } - + container.innerHTML = versions.map(v => { const date = new Date(v.date).toLocaleDateString('zh-CN'); - // Support both array and string format for changes - let changesHtml; - if (Array.isArray(v.changes)) { - changesHtml = v.changes.map(c => `
  • ${c}
  • `).join(''); - } else { - // String format: split by newline and format - changesHtml = v.changes.split('\n').filter(line => line.trim()).map(c => `
  • ${c.trim()}
  • `).join(''); - } + + // 生成HTML + const changesHtml = v.changes.map(cat => { + const itemsHtml = cat.items.map(item => { + if (typeof item === 'string') { + // 普通描述项 + return `
  • ${item}
  • `; + } else if (item.title && item.desc) { + // 有子标题的项 + return ` +
  • +
    ${item.title}
    +
    ${item.desc}
    +
  • + `; + } + return ''; + }).join(''); + + return ` +
    +

    + + ${cat.category} +

    + +
    + `; + }).join(''); + return `

    ${v.version}

    ${date}
    - +
    `; }).join(''); diff --git a/website/public/changelog.json b/website/public/changelog.json index 81ba88028ca0e6a19de674ac366c4956435fd861..c2338da1460bc7b00603775474802a20f4801b5a 100644 --- a/website/public/changelog.json +++ b/website/public/changelog.json @@ -1,156 +1,273 @@ { "versions": [ + { + "version": "v1.4.1", + "date": "2026-03-02", + "changes": [ + { + "category": "问题修复", + "items": [ + "修复面板切换时线程崩溃问题", + "修复编辑配色对话框初始化时自动滚动到末尾的问题", + "修复明度直方图拖动时区域指示不匹配的问题" + ] + }, + { + "category": "界面优化", + "items": [ + "统一明度遮罩颜色并优化颜色方案" + ] + }, + { + "category": "功能优化", + "items": [ + "日志系统支持每次启动创建新文件", + "优化Mac构建流程输出文件命名" + ] + } + ] + }, { "version": "v1.4.0", "date": "2026-03-01", "changes": [ - "取色卡 v1.4 更新日志", - "新增功能", - "渐变提取", - "新增渐变提取功能,支持RGB/HSB/LAB三种颜色空间的渐变插值", - "官网入口", - "新增项目官网和关于对话框官网按钮", - "版本管理", - "版本比较支持预发布版本号识别", - "日志系统", - "新增日志系统,支持问题排查、行为追踪、性能监控", - "问题修复", - "修复配色源显示逻辑,使用name字段替代中文name_zh字段", - "修复多线程和延迟加载导致的闪退问题,提升稳定性", - "修复配色管理面板编辑后页码重置问题", - "界面优化", - "更换程序 Logo", - "缩小配色管理分组下拉框宽度", - "优化主窗口启动位置为屏幕居中显示", - "优化多语言显示,精简法语和俄语翻译", - "编辑配色对话框打开默认自动滚动到底部", - "性能提升", - "优化SVG智能映射逻辑,新增覆盖检测功能", - "将直方图分区从8个改为9个,优化明度分析精度", - "内容调整", - "删除配色源名称中的「主题」和「配色」后缀", - "丰富配色预览内置SVG模板" + { + "category": "新增功能", + "items": [ + { + "title": "渐变提取", + "desc": "新增渐变提取功能,支持RGB/HSB/LAB三种颜色空间的渐变插值" + }, + { + "title": "官网入口", + "desc": "新增项目官网和关于对话框官网按钮" + }, + { + "title": "版本管理", + "desc": "版本比较支持预发布版本号识别" + }, + { + "title": "日志系统", + "desc": "新增日志系统,支持问题排查、行为追踪、性能监控" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复配色源显示逻辑,使用name字段替代中文name_zh字段", + "修复多线程和延迟加载导致的闪退问题,提升稳定性", + "修复配色管理面板编辑后页码重置问题" + ] + }, + { + "category": "界面优化", + "items": [ + "更换程序 Logo", + "缩小配色管理分组下拉框宽度", + "优化主窗口启动位置为屏幕居中显示", + "优化多语言显示,精简法语和俄语翻译", + "编辑配色对话框打开默认自动滚动到底部" + ] + }, + { + "category": "逻辑优化", + "items": [ + "优化SVG智能映射逻辑,新增覆盖检测功能", + "将直方图分区从8个改为9个,优化明度分析精度" + ] + }, + { + "category": "内容调整", + "items": [ + "删除配色源名称中的「主题」和「配色」后缀", + "丰富配色预览内置SVG模板" + ] + } ] }, { "version": "v1.3.0 Beta", "date": "2026-02-22", "changes": [ - "取色卡 v1.3.0 Beta 更新日志", - "新增功能", - "多语言支持", - "新增多语言切换功能,支持简体中文、繁體中文、English、日本語、Français、Русский 六种语言", - "在设置界面即可切换语言,实时生效", - "色彩分析增强", - "新增图片色彩空间识别与Gamma校正支持,提升颜色提取准确性", - "采样点数量上限提升至6个,可同时提取更多颜色", - "配色预览面板", - "配色预览功能全面重构,统一使用SVG格式模板", - "新增大量场景示例", - "新增色彩管理面板分组功能,便于浏览和管理配色方案", - "问题修复", - "修复色轮采样点无法到达圆周的问题,现在采样点可以正确移动到色轮边缘", - "修复RYB模式配色关系不正确的问题,配色生成结果更加准确", - "界面优化", - "调整色轮色相起始位置至12点钟方向,更符合设计习惯", - "调整主窗口最小宽度和默认宽度,优化界面布局", - "内置色彩分批加载时添加加载中过渡标识,提升加载体验", - "直方图组件添加加载中提示,大图片加载时反馈更清晰", - "优化直方图自适应缩放模式显示逻辑", - "性能提升", - "实现配色计算和直方图计算缓存机制,重复操作响应更快", - "优化直方图计算服务,缩短延迟计算时间,大图片加载性能显著提升", - "实现业务服务延迟加载,减少应用启动时间", - "实现图片内存管理和线程安全优化,运行更稳定", - "许可证完善", - "添加PyInstaller许可证到项目许可证文档,完善开源合规性" + { + "category": "新增功能", + "items": [ + { + "title": "多语言支持", + "desc": "新增多语言切换功能,支持简体中文、繁體中文、English、日本語、Français、Русский 六种语言,在设置界面即可切换语言,实时生效" + }, + { + "title": "色彩分析增强", + "desc": "新增图片色彩空间识别与Gamma校正支持,提升颜色提取准确性,采样点数量上限提升至6个,可同时提取更多颜色" + }, + { + "title": "配色预览面板", + "desc": "配色预览功能全面重构,统一使用SVG格式模板,新增大量场景示例,新增色彩管理面板分组功能,便于浏览和管理配色方案" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复色轮采样点无法到达圆周的问题,现在采样点可以正确移动到色轮边缘", + "修复RYB模式配色关系不正确的问题,配色生成结果更加准确" + ] + }, + { + "category": "界面优化", + "items": [ + "调整色轮色相起始位置至12点钟方向,更符合设计习惯", + "调整主窗口最小宽度和默认宽度,优化界面布局", + "内置色彩分批加载时添加加载中过渡标识,提升加载体验", + "直方图组件添加加载中提示,大图片加载时反馈更清晰", + "优化直方图自适应缩放模式显示逻辑" + ] + }, + { + "category": "性能提升", + "items": [ + "实现配色计算和直方图计算缓存机制,重复操作响应更快", + "优化直方图计算服务,缩短延迟计算时间,大图片加载性能显著提升", + "实现业务服务延迟加载,减少应用启动时间", + "实现图片内存管理和线程安全优化,运行更稳定" + ] + }, + { + "category": "许可证完善", + "items": [ + "添加PyInstaller许可证到项目许可证文档,完善开源合规性" + ] + } ] }, { "version": "v1.2.0", "date": "2026-02-15", "changes": [ - "取色卡 v1.2 更新日志", - "新增功能", - "色彩分析增强", - "新增色彩提取页面高饱和度/高明度区域显示功能,支持自定义阈值配置", - "RGB直方图添加通道切换按钮,支持点击按钮切换显示单通道或全通道", - "在色环周围显示色相名称标签,色彩识别更直观", - "色盲模拟预览", - "新增色盲模拟预览功能,支持多种色盲类型模拟", - "对比度检查", - "新增对比度检查功能,确保色彩组合的可读性", - "配色预览面板", - "新增配色预览面板,支持10种场景的预览", - "支持导入SVG文件预览", - "右键菜单可删除颜色和复制HEX值", - "内置色彩面板", - "新增内置色彩面板,集成大量开源配色方案", - "包含 Open Color、Nice Color Palettes、Tailwind CSS Colors 等知名配色库", - "支持配色随机模式、收藏到配色管理面板、预览功能", - "配色管理增强", - "为色卡收藏面板添加16进制颜色值编辑功能", - "新增编辑配色对话框,支持添加和编辑配色", - "启动体验优化", - "添加启动画面并优化启动时机", - "问题修复", - "修复增加色彩提取采样点数后新色卡信息不更新的问题", - "修复全屏按钮窗口状态保存与最大化混淆的问题", - "修复Win10深色模式适配问题", - "修复明度提取界面图片加载时Zone标签框未隐藏的问题", - "修复HSB色轮明度计算问题并优化配色方案随机算法", - "修复色块边框主题切换适配问题", - "修复HSB色轮在窗口调整和明度调整时的闪烁问题", - "修正所有文件中的版权和官网信息", - "修复 Logo 路径硬编码导致打包后无法显示的问题", - "移除明度面板导入图片时标题栏文件名显示", - "界面优化", - "移除收藏页面操作按钮的Tooltip", - "缩小配色生成卡片中16进制输入框与操作按钮的间距", - "调整主窗口大小", - "为图标增加圆角裁切", - "优化图标和交互体验,禁用原生右键菜单", - "性能提升", - "优化应用启动速度:色轮缓存和配色方案颜色延迟生成", - "代码重构", - "将色卡收藏面板重命名为配色管理,将配色方案面板重命名为配色生成", - "统一配色管理导入导出JSON格式", - "新增编辑配色对话框" + { + "category": "新增功能", + "items": [ + { + "title": "色彩分析增强", + "desc": "新增色彩提取页面高饱和度/高明度区域显示功能,支持自定义阈值配置,RGB直方图添加通道切换按钮,支持点击按钮切换显示单通道或全通道,在色环周围显示色相名称标签,色彩识别更直观" + }, + { + "title": "色盲模拟预览", + "desc": "新增色盲模拟预览功能,支持多种色盲类型模拟" + }, + { + "title": "对比度检查", + "desc": "新增对比度检查功能,确保色彩组合的可读性" + }, + { + "title": "配色预览面板", + "desc": "新增配色预览面板,支持10种场景的预览,支持导入SVG文件预览,右键菜单可删除颜色和复制HEX值" + }, + { + "title": "内置色彩面板", + "desc": "新增内置色彩面板,集成大量开源配色方案,包含 Open Color、Nice Color Palettes、Tailwind CSS Colors 等知名配色库,支持配色随机模式、收藏到配色管理面板、预览功能" + }, + { + "title": "配色管理增强", + "desc": "为色卡收藏面板添加16进制颜色值编辑功能,新增编辑配色对话框,支持添加和编辑配色" + }, + { + "title": "启动体验优化", + "desc": "添加启动画面并优化启动时机" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复增加色彩提取采样点数后新色卡信息不更新的问题", + "修复全屏按钮窗口状态保存与最大化混淆的问题", + "修复Win10深色模式适配问题", + "修复明度提取界面图片加载时Zone标签框未隐藏的问题", + "修复HSB色轮明度计算问题并优化配色方案随机算法", + "修复色块边框主题切换适配问题", + "修复HSB色轮在窗口调整和明度调整时的闪烁问题", + "修正所有文件中的版权和官网信息", + "修复 Logo 路径硬编码导致打包后无法显示的问题", + "移除明度面板导入图片时标题栏文件名显示" + ] + }, + { + "category": "界面优化", + "items": [ + "移除收藏页面操作按钮的Tooltip", + "缩小配色生成卡片中16进制输入框与操作按钮的间距", + "调整主窗口大小", + "为图标增加圆角裁切", + "优化图标和交互体验,禁用原生右键菜单" + ] + }, + { + "category": "性能提升", + "items": [ + "优化应用启动速度:色轮缓存和配色方案颜色延迟生成" + ] + }, + { + "category": "代码重构", + "items": [ + "将色卡收藏面板重命名为配色管理,将配色方案面板重命名为配色生成", + "统一配色管理导入导出JSON格式", + "新增编辑配色对话框" + ] + } ] }, { "version": "v1.1.0", "date": "2026-02-08", "changes": [ - "取色卡 v1.1 更新日志", - "新增功能", - "智能配色方案", - "新增配色方案功能,支持 RGB/RYB 两种色彩逻辑", - "提供 5 种专业配色算法:同色系、邻近色、互补色、分离补色、双补色", - "色卡收藏功能", - "支持色彩提取、配色方案面板的配色收藏", - "支持收藏管理,可批量导入导出", - "图片分析增强", - "集成 MMCQ 算法,自动提取图片主色调", - "直方图新增自适应缩放,支持线性和平方根两种模式切换", - "明度区域采用 Adobe 标准命名:黑色/阴影/中间调/高光/白色", - "界面体验升级", - "新增深色/浅色主题切换,优化文本对比度", - "标题栏新增全屏按钮,支持 F11 快捷键", - "重构导入图片,分阶段加载有明确的视觉反馈", - "支持拖拽图片直接导入", - "问题修复", - "修复色彩提取和明度提取面板布局重叠问题", - "修复明度直方图蓝色指示框松开后不消失的问题", - "优化异常报错过滤,减少干扰提示", - "界面优化", - "统一图片显示器、直方图、色环背景色为深灰色", - "设置界面内容重新分类,更清晰易用", - "16进制颜色值开关显示中文开/关", - "新增界面布局规范,防止组件重叠", - "性能提升", - "使用 NumPy 向量化优化明度直方图计算,响应更快", - "代码重构:统一颜色管理,消除硬编码" + { + "category": "新增功能", + "items": [ + { + "title": "智能配色方案", + "desc": "新增配色方案功能,支持 RGB/RYB 两种色彩逻辑,提供 5 种专业配色算法:同色系、邻近色、互补色、分离补色、双补色" + }, + { + "title": "色卡收藏功能", + "desc": "支持色彩提取、配色方案面板的配色收藏,支持收藏管理,可批量导入导出" + }, + { + "title": "图片分析增强", + "desc": "集成 MMCQ 算法,自动提取图片主色调,直方图新增自适应缩放,支持线性和平方根两种模式切换,明度区域采用 Adobe 标准命名:黑色/阴影/中间调/高光/白色" + }, + { + "title": "界面体验升级", + "desc": "新增深色/浅色主题切换,优化文本对比度,标题栏新增全屏按钮,支持 F11 快捷键,重构导入图片,分阶段加载有明确的视觉反馈,支持拖拽图片直接导入" + } + ] + }, + { + "category": "问题修复", + "items": [ + "修复色彩提取和明度提取面板布局重叠问题", + "修复明度直方图蓝色指示框松开后不消失的问题", + "优化异常报错过滤,减少干扰提示" + ] + }, + { + "category": "界面优化", + "items": [ + "统一图片显示器、直方图、色环背景色为深灰色", + "设置界面内容重新分类,更清晰易用", + "16进制颜色值开关显示中文开/关", + "新增界面布局规范,防止组件重叠" + ] + }, + { + "category": "性能提升", + "items": [ + "使用 NumPy 向量化优化明度直方图计算,响应更快", + "代码重构:统一颜色管理,消除硬编码" + ] + } ] } ] diff --git "a/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" "b/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" index 960bca87b69924e407b109a4a0522e51567e8f20..37d9465c3693417f250dc39975174623ea7f2bf4 100644 --- "a/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" +++ "b/\346\226\207\346\241\243/\345\274\200\345\217\221\350\247\204\350\214\203.md" @@ -1880,16 +1880,27 @@ def _clear_color_cards(self): ### 13.2 分类规范 +**分类说明:** + +以下分类为常用示例,可根据实际更新内容灵活调整分类名称,无需严格对应。只需保持格式正确(`## Emoji 分类名称`)即可。 + | 分类 | Emoji | 说明 | 示例 | |:---:|:---:|:---:|:---| | 新增功能 | ✨ | 新功能、新特性 | 新增色盲模拟预览功能 | | 问题修复 | 🔧 | Bug修复 | 修复全屏按钮窗口状态保存问题 | | 界面优化 | 🎨 | UI样式、布局调整 | 优化图标和交互体验 | | 性能提升 | ⚡ | 性能优化 | 优化应用启动速度 | +| 功能优化 | ⚡ | 功能层面改进 | 日志系统支持每次启动创建新文件 | | 代码重构 | 🏗️ | 代码结构调整 | 重命名配色管理相关类 | | 文档更新 | 📝 | 文档修改 | 修正版权和官网信息 | | 内容调整 | 📋 | 内容修改 | 为图标增加圆角裁切 | +**灵活调整示例:** + +- 若某版本只有修复和优化,可只保留"问题修复"和"界面优化"两个分类 +- 若有特殊类型的更新,可新增分类,如"构建优化"、"兼容性改进"等 +- 分类名称应简洁明了,便于用户理解 + ### 13.3 内容组织原则 **功能模块分组:** @@ -2245,15 +2256,16 @@ class MyInterface(QWidget): **存储位置:** - 日志存储在配置目录下的 `logs/` 子目录 -- 路径:`~/.color_card/logs/color_card.log` +- 路径:`~/.color_card/logs/` **文件命名:** -- 当前日志:`color_card.log` -- 历史日志:`color_card.log.1`, `color_card.log.2` 等 +- 格式:`Color Card_版本号_YYYYMMDD_HHMMSS.log` +- 示例:`Color Card_1.4.0_20260302_143025.log` +- 每次启动应用创建一个新的日志文件 -**轮转策略:** -- 按大小轮转:单个日志文件最大 10MB -- 保留数量:保留最近 7 个备份文件 +**清理策略:** +- 保留天数:保留最近 30 天的日志文件 +- 启动时自动清理过期日志 ### 17.3 日志级别定义 @@ -2855,10 +2867,10 @@ def _get_about_text(self): |版本 |日期 |变更内容 | |:---:|:---:|:---:| -|3.35 |2026-02-28 |日志系统第二阶段:核心模块日志接入(color_service.py、image_service.py、config.py);用户操作日志接入(color_extract.py、canvases.py);添加性能日志记录(extract_dominant_colors、load_image) | -|3.34 |2026-02-28 |新增日志系统:创建 `core/logger.py` 模块,包含 `LoggerManager`、`get_logger`、`log_user_action`、`log_performance`;日志存储在 `~/.color_card/logs/` 目录,支持文件轮转(最大10MB,保留7个备份);在 `main.py` 中集成日志初始化和全局异常捕获;更新项目结构和开发规范(新增第17章日志系统规范) | +|3.35 |2026-03-02 |优化更新日志分类规范:新增分类说明,明确分类可灵活调整;新增"功能优化"分类;添加灵活调整示例说明 | +|3.34 |2026-02-28 |新增日志系统,更新项目结构和开发规范(新增第17章日志系统规范) | |3.33 |2026-02-28 |P3多线程优化修复:优化 `HistogramCalculator` 和 `ProgressiveImageLoader` 的 `cancel()` 方法移除 `wait()` 调用;为所有线程类和服务类添加线程安全文档注释;创建 `tests/` 测试目录,包含 19 个多线程测试用例;创建 `pytest.ini` 配置文件和 `tests/requirements-dev.txt` 开发依赖文件;新增第20章测试规范;更新章节编号(原第20章开源许可证管理规范改为第21章,原第21章附录改为第22章) | -|3.32 |2026-02-27 |重构明度分析Zone分区:将直方图分区从8个改为9个(Zone 0-8),使用 `ZONE_WIDTH = 255/9 ≈ 28.33` 计算Zone边界;更新Zone标签命名(黑色×1、阴影×2、中间调×3、高光×2、白色×1);修改 `core/color.py`、`ui/histograms.py`、`ui/canvases.py`、`core/luminance_service.py` 中的Zone计算逻辑;更新开发规范第6.3节Zone分区规范;更新README.md明度分析描述 | +|3.32 |2026-02-27 |重构明度分析Zone分区:将直方图分区从8个改为9个(Zone 0-8),更新开发规范第6.3节Zone分区规范| |3.31 |2026-02-26 |优化SVG智能映射逻辑:新增覆盖检测功能,检测被完全覆盖的元素并跳过映射;简化配色分配逻辑,所有元素按面积平等处理;根据面积最大元素的覆盖率决定是否添加背景矩形(<90%添加,>=90%不添加);更新第9.7.3节智能映射规则说明 | |3.30 |2026-02-26 |新增渐变提取功能:创建 `core/gradient.py` 模块实现三种颜色空间(RGB/HSB/LAB)的渐变插值算法;创建 `ui/gradient_extract.py` 模块实现渐变提取界面(GradientExtractInterface、GradientCardPanel、GradientPreviewWidget);支持起始/结束颜色选择、中间色数量控制、渐变预览、随机生成、收藏功能;收藏时先打开编辑配色对话框;更新项目结构、开发规范和语言包 | |3.29 |2026-02-24 |新增项目官网:创建 `docs/` 和 `website/` 目录,添加官网页面(功能特性、界面预览、配色方案、更新日志、下载),支持 GitHub Pages 自动部署;新增第15章项目官网维护规范;更新 README.md 添加官网链接;更新关于对话框添加官网按钮 | @@ -2895,7 +2907,7 @@ def _get_about_text(self): |2.20 |2026-02-11 |完善配色预览场景功能:新增 brand(品牌)、poster(海报)、pattern(图案)、magazine(杂志排版)四个配置化场景;所有场景完全配置化,从 `scenes.json` 加载;清理 `ui/preview_widgets.py` 中的硬编码文本,UI/Web 场景文本支持通过配置自定义;删除废弃的 `MobileUIPreview` 和 `WebPreview` 类,统一使用 `ConfigurablePreviewScene`;更新开发规范文档(第8章场景类型规范) | |2.19 |2026-02-11 |新增SVG智能配色映射功能:创建 `core/svg_color_mapper.py` 核心模块,实现 SVG 解析、元素分类、智能配色映射;支持智能配色映射模式;支持 CSS 类样式解析(Illustrator 导出的 SVG 常用格式);基于元素面积的智能配色映射算法;检测 SVG 是否有背景元素,为透明背景自动添加背景矩形;更新 `SVGPreviewWidget` 支持新的配色映射功能;更新项目结构和开发规范 | |2.18 |2026-02-10 |新增场景配置化功能:创建 `preview_scenes/` 目录和 `scenes.json` 配置文件;新增 `SceneConfigManager` 场景配置管理器,支持场景的导入导出;新增 `BasePreviewScene` 场景基类和 `PreviewSceneFactory` 场景工厂;实现 `MobileUIPreview` 手机UI预览和 `WebPreview` 网页预览组件;更新 `PreviewSceneSelector` 从配置动态加载场景列表;所有场景支持导入导出配置;更新项目结构和开发规范(第8章) | -|2.17 |2026-02-10 |重命名"配色方案"为"配色生成","色彩管理"为"配色管理":将 `scheme_widgets.py` 重命名为 `generation_widgets.py`,类名 `SchemeColorInfoCard` 改为 `GenerationColorInfoCard`,`SchemeColorPanel` 改为 `GenerationColorPanel`;将 `color_management_widgets.py` 重命名为 `palette_management_widgets.py`,类名 `ColorManagementSchemeCard` 改为 `PaletteManagementCard`,`ColorManagementSchemeList` 改为 `PaletteManagementList`;更新所有相关引用、导航栏显示和文档 | +|2.17 |2026-02-10 |重命名"配色方案"为"配色生成","色彩管理"为"配色管理"更新所有相关引用、导航栏显示和文档 | |2.16 |2026-02-10 |新增配色预览功能:创建 ui/preview_widgets.py 配色预览组件模块,包含可拖拽颜色圆点、插画预览、排版预览等组件;新增 ColorPreviewInterface 界面,支持从配色管理页面跳转预览配色在不同场景下的应用效果 | |2.15 |2026-02-09 |优化应用启动速度:色轮缓存和配色生成颜色改用延迟生成,避免阻塞启动;新增应用启动优化策略规范(7.3节) | |2.14 |2026-02-09 |重命名"色卡收藏"面板为"色彩管理":将 `favorite_widgets.py` 重命名为 `color_management_widgets.py`,类名 `FavoritesInterface` 改为 `ColorManagementInterface`,更新所有相关引用和导航栏显示 |