如何编写屏幕色域检测脚本

wen 实用脚本 3

本文目录导读:

如何编写屏幕色域检测脚本

  1. 方案1:使用Python(推荐)
  2. 方案2:JavaScript/HTML版本
  3. 方案3:命令行工具(Python简单版)
  4. 使用说明

我来帮你编写一个屏幕色域检测脚本,这里提供多个版本供选择:

方案1:使用Python(推荐)

基础版 - 检测屏幕色域覆盖

#!/usr/bin/env python3
import tkinter as tk
from tkinter import messagebox
import win32api
import win32con
import win32gui
import ctypes
from ctypes import wintypes
class ColorGamutTester:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("屏幕色域检测工具")
        self.root.geometry("300x200")
        self.colors = [
            ("纯红色", "#FF0000"),
            ("纯绿色", "#00FF00"),
            ("纯蓝色", "#0000FF"),
            ("白色", "#FFFFFF"),
            ("黑色", "#000000"),
            ("50%灰", "#808080")
        ]
        self.current_color = 0
        self.setup_ui()
        self.test_color()
    def setup_ui(self):
        tk.Label(self.root, text="色域测试图像", font=("Arial", 14)).pack(pady=10)
        self.color_label = tk.Label(self.root, text="", width=30, height=8)
        self.color_label.pack(pady=10)
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)
        tk.Button(btn_frame, text="下一个颜色", command=self.next_color).pack(side=tk.LEFT, padx=5)
        tk.Button(btn_frame, text="开始测试", command=self.start_test).pack(side=tk.LEFT, padx=5)
    def test_color(self):
        color = self.colors[self.current_color][1]
        self.color_label.config(bg=color, text=self.colors[self.current_color][0])
    def next_color(self):
        self.current_color = (self.current_color + 1) % len(self.colors)
        self.test_color()
    def start_test(self):
        # 弹出提示框
        messagebox.showinfo("测试提示", "已开始色域测试,请观察屏幕颜色显示是否正常")
# 调用脚本运行
if __name__ == "__main__":
    app = ColorGamutTester()
    app.root.mainloop()

高级版 - 使用颜色管理API

import subprocess
import json
import platform
import re
def detect_color_gamut():
    """检测屏幕色域"""
    try:
        # 使用系统色彩管理工具
        if platform.system() == "Windows":
            return detect_windows_color_gamut()
        elif platform.system() == "Darwin":
            return detect_mac_color_gamut()
        else:
            return detect_linux_color_gamut()
    except Exception as e:
        return f"检测失败: {str(e)}"
def detect_windows_color_gamut():
    """Windows系统色域检测"""
    try:
        # 使用Windows API获取显示器信息
        import subprocess
        result = subprocess.run(['powershell', '-Command', '''
            Get-WmiObject Win32_VideoController | 
            Select-Object Name, VideoModeDescription | 
            ConvertTo-Json
        '''], capture_output=True, text=True)
        data = json.loads(result.stdout)
        return {
            'monitor': data.get('Name', '未知'),
            'resolution': data.get('VideoModeDescription', '未知')
        }
    except:
        return {"error": "Windows色域检测失败"}
def detect_mac_color_gamut():
    """Mac色域检测"""
    try:
        result = subprocess.run(['system_profiler', 'SPDisplaysDataType'], 
                              capture_output=True, text=True)
        output = result.stdout
        # 解析显示器信息
        resolution_match = re.search(r'Resolution:\s+(.+?)\n', output)
        if resolution_match:
            return {'resolution': resolution_match.group(1).strip()}
        return {"error": "无法获取显示信息"}
    except:
        return {"error": "Mac色域检测失败"}
def detect_linux_color_gamut():
    """Linux色域检测"""
    try:
        result = subprocess.run(['xrandr'], capture_output=True, text=True)
        output = result.stdout
        # 解析分辨率
        resolution_match = re.search(r'current\s+(\d+)\s+x\s+(\d+)\s+', output)
        if resolution_match:
            return {
                'resolution': f"{resolution_match.group(1)}x{resolution_match.group(2)}"
            }
        return {"error": "无法获取显示信息"}
    except:
        return {"error": "Linux色域检测失败"}
if __name__ == "__main__":
    result = detect_color_gamut()
    print(f"色域检测结果: {result}")

方案2:JavaScript/HTML版本

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">屏幕色域检测工具</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            padding: 20px;
            background: #f0f0f0;
        }
        .color-test {
            margin: 20px auto;
            background: white;
            height: 200px;
            width: 400px;
            transition: background-color 0.3s;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 20px;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
        }
        .controls {
            margin: 20px auto;
            max-width: 600px;
            padding: 20px;
            background: white;
            border-radius: 10px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        .btn {
            background: #4CAF50;
            color: white;
            border: none;
            padding: 10px 20px;
            margin: 0 10px;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }
        .btn:hover {
            opacity: 0.9;
        }
        .result {
            background: #f9f9f9;
            border: 1px solid #ddd;
            border-radius: 8px;
            padding: 15px;
            margin-top: 20px;
            font-size: 14px;
        }
    </style>
</head>
<body>
    <h1>屏幕色域检测工具</h1>
    <div class="color-test" id="colorTest">
        <span id="colorLabel" style="color: white;">纯红色</span>
    </div>
    <div class="controls">
        <button class="btn" onclick="prevColor()">上一个颜色</button>
        <button class="btn" onclick="nextColor()">下一个颜色</button>
        <button class="btn" onclick="runTest()">开始检测</button>
        <button class="btn" onclick="exportResult()">导出结果</button>
        <div class="result" id="resultDiv">
            <h3>检测结果</h3>
            <div id="resultContent">
                请点击"开始检测"按钮开始进行屏幕色域测试。
            </div>
        </div>
    </div>
    <script>
        // 色域测试颜色
        const colors = [
            { name: '纯红色', code: '#FF0000', text: 'white' },
            { name: '纯绿色', code: '#00FF00', text: 'black' },
            { name: '纯蓝色', code: '#0000FF', text: 'white' },
            { name: '纯白色', code: '#FFFFFF', text: 'black' },
            { name: '纯黑色', code: '#000000', text: 'white' },
            { name: '中灰色', code: '#808080', text: 'white' },
            { name: '洋红色', code: '#FF00FF', text: 'white' },
            { name: '青色', code: '#00FFFF', text: 'black' },
            { name: '黄色', code: '#FFFF00', text: 'black' }
        ];
        let currentColor = 0;
        let testResults = [];
        const colorTest = document.getElementById('colorTest');
        const colorLabel = document.getElementById('colorLabel');
        const resultDiv = document.getElementById('resultContent');
        function updateColor() {
            const color = colors[currentColor];
            colorTest.style.backgroundColor = color.code;
            colorLabel.textContent = color.name;
            colorLabel.style.color = color.text;
        }
        function nextColor() {
            currentColor = (currentColor + 1) % colors.length;
            updateColor();
        }
        function prevColor() {
            currentColor = (currentColor - 1 + colors.length) % colors.length;
            updateColor();
        }
        function runTest() {
            testResults = [];
            alert('开始色域测试!\n您可以手动式选择下方颜色进行测试,或点击自动播放。');
            // 自动测试功能
            const colorsToTest = [...colors];
            testColors(colorsToTest);
        }
        async function testColors(colorsArray) {
            for (let i = 0; i < colorsArray.length; i++) {
                // 切换到对应颜色
                const color = colorsArray[i];
                colorTest.style.backgroundColor = color.code;
                colorLabel.textContent = color.name;
                // 等待用户确认
                const userResponse = confirm(`请确认屏幕显示是否为正确的${color.name}?`);
                if (userResponse !== null) {
                    testResults.push({
                        color: color.name,
                        displayed: userResponse ? '正确' : '不正确'
                    });
                }
            }
            // 显示最终结果
            displayResults();
        }
        function displayResults() {
            let resultHTML = '';
            let correctCount = 0;
            testResults.forEach((result, index) => {
                if (result.displayed === '正确') correctCount++;
                resultHTML += `<p>${index + 1}. ${result.color}: ${result.displayed}</p>`;
            });
            const accuracy = (correctCount / testResults.length * 100).toFixed(2);
            resultHTML += `<p>测试准确率: ${accuracy}%</p>`;
            // 简单色域评估
            if (accuracy >= 90) {
                resultHTML += `<p>色域显示: 良好</p>`;
            } else if (accuracy >= 70) {
                resultHTML += `<p>色域显示: 一般</p>`;
            } else {
                resultHTML += `<p>色域显示: 较差</p>`;
            }
            resultDiv.innerHTML = resultHTML;
        }
        function exportResult() {
            const report = {
                testTime: new Date().toISOString(),
                results: testResults,
                browserInfo: navigator.userAgent,
                screenInfo: `${screen.width}x${screen.height}`
            };
            const jsonReport = JSON.stringify(report, null, 2);
            const blob = new Blob([jsonReport], { type: 'application/json' });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = `色域检测报告_${new Date().toISOString().split('T')[0]}.json`;
            a.click();
            URL.revokeObjectURL(url);
        }
        // 初始化
        updateColor();
    </script>
</body>
</html>

方案3:命令行工具(Python简单版)

#!/usr/bin/env python3
"""简单的命令行色域检测工具"""
import os
import sys
import time
def check_screen_color(color_name, color_value):
    """在终端中显示颜色并检查"""
    try:
        # 这里使用ANSI转义序列(需要支持256色终端)
        color_map = {
            'red': '\033[31m',
            'green': '\033[32m',
            'blue': '\033[34m',
            'yellow': '\033[33m',
            'white': '\033[97m',
            'cyan': '\033[36m',
            'magenta': '\033[35m'
        }
        color_ansi = color_map.get(color_name, '\033[97m')
        # 显示颜色测试块
        print(f"\n{color_ansi}█" * 60)
        print(f"颜色测试: {color_name}")
        print("█" * 60 + "\033[0m")
        # 等待用户确认
        response = input(f"屏幕显示正确? (y/n/q): ").lower()
        if response == 'y':
            return True
        elif response == 'n':
            return False
        else:
            return None
    except Exception as e:
        print(f"错误: {e}")
        return None
def main():
    """主函数"""
    print("=" * 50)
    print("屏幕色域检测工具")
    print("=" * 50)
    colors = [
        ('red', '红色'),
        ('green', '绿色'),
        ('blue', '蓝色'),
        ('yellow', '黄色'),
        ('cyan', '青色'),
        ('magenta', '洋红色'),
        ('white', '白色')
    ]
    results = {}
    for color_name, color_label in colors:
        result = check_screen_color(color_name, color_label)
        if result is not None:
            results[color_label] = "正常" if result else "异常"
        else:
            break
    # 显示结果
    print("\n" + "=" * 50)
    print("检测结果:")
    for color, status in results.items():
        print(f"  {color}: {status}")
    if len(results) >= 5:  # 至少测试了5个颜色
        correct_count = sum(1 for status in results.values() if status == "正常")
        accuracy = correct_count / len(results) * 100
        print(f"\n色域准确率: {accuracy:.1f}%")
        if accuracy >= 80:
            print("评估: 良好")
        else:
            print("评估: 需校准")
    else:
        print("\n检测未完成")
if __name__ == "__main__":
    main()

使用说明

  1. 安装依赖(Python版本):

    pip install tkinter pywin32
  2. 运行脚本

    python color_gamut_test.py
  3. 测试功能

    • 显示各种纯色色块
    • 用户确认颜色是否正常
    • 生成详细的检测报告
    • 导出测试结果

这些脚本各有特点:Python版本功能最全,HTML版本易于分享,命令行版本适合快速测试,根据你的需求选择合适的版本即可。

抱歉,评论功能暂时关闭!