手撕一个图片色卡提取器,可自定义提取色卡数量!

news2024/12/24 20:12:31

在一些特殊的业务场景中,我们需要一次性提取一张图片中的色卡信息,并且需要使用十六进制的颜色表示方法进行展示。

今天得空做了一个小工具,用来自定义的提取某一张图片中的色卡信息,需要提取某张图片中的色卡可以自行选择。

提取色卡信息.gif

实现过程就是比较简单的,主要是通过extcolors的python非标准库来实现的。

另外的python非标准库就是PyQt5的使用,还有os、sys等系统或文件操作模块。

没有安装上述几个python非标准库的话,我们直接使用pip的方式安装一下即可。

pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/

pip install extcolors -i https://pypi.tuna.tsinghua.edu.cn/simple/

在安装完成相关的模块之后,将我们需要的python模块导入到开发的代码块中。

# It's a module that allows you to print the stack trace of an exception.
import traceback

# It's a module that allows you to print the stack trace of an exception.
import extcolors

# It's importing all the classes from the QtWidgets module.
from PyQt5.QtWidgets import *

# It's importing all the classes from the QtGui module.
from PyQt5.QtGui import *

# It's importing all the classes from the QtCore module.
from PyQt5.QtCore import *

# It's importing the sys module.
import sys

# It's importing the os module.
import os

在代码块中创建ColorUI作为UI组件及布局的使用类,将UI相关的操作和槽函数全部放到这个类中进行处理。

class ColorUI(QWidget):
    def __init__(self):
        """
        A constructor. It is called when an object is created from a class and it allows the class to initialize the
        attributes of a class.
        """
        super(ColorUI, self).__init__()
        self.init_ui()

    def init_ui(self):
        """
        This function initializes the UI.
        """
        self.setWindowTitle('图片颜色提取器 公众号:Python 集中营')
        self.setWindowIcon(QIcon('color.ico'))
        self.resize(500, 300)

        self.image_label = QLabel()
        self.image_label.setMinimumWidth(300)
        self.image_label.setMaximumHeight(300)
        self.image_label.setText('公众号:Python 集中营')
        self.image_label.setAlignment(Qt.AlignCenter)
        self.image_label.setStyleSheet('font-size:20px;color:blue;')
        self.image_label.setScaledContents(True)

        self.image_path_in = QLineEdit()
        self.image_path_in.setPlaceholderText('源图片路径')
        self.image_path_in.setReadOnly(True)

        self.image_path_btn = QPushButton()
        self.image_path_btn.setText('加载源图片')
        self.image_path_btn.clicked.connect(self.image_path_btn_click)

        self.set_color_num_label = QLabel()
        self.set_color_num_label.setText('设置提取色卡数量:')

        self.set_color_num_in = QLineEdit()
        self.set_color_num_in.setPlaceholderText('例如:10')

        self.start_btn = QPushButton()
        self.start_btn.setText('开始提取颜色')
        self.start_btn.clicked.connect(self.start_btn_click)

        self.brower = QTextBrowser()
        self.brower.setReadOnly(True)
        self.brower.setFont(QFont('宋体', 8))
        self.brower.setPlaceholderText('日志处理过程区域...')
        self.brower.ensureCursorVisible()

        hbox = QHBoxLayout()

        left_box = QVBoxLayout()
        right_box = QVBoxLayout()

        left_box.addWidget(self.image_label)
        right_form_box = QFormLayout()
        right_form_box.addRow(self.image_path_in, self.image_path_btn)
        right_form_box.addRow(self.set_color_num_label, self.set_color_num_in)
        right_form_box.addRow(self.start_btn)
        right_box.addLayout(right_form_box)
        right_box.addWidget(self.brower)

        hbox.addLayout(left_box)
        hbox.addLayout(right_box)

        self.thread_ = ColorWork(self)
        self.thread_.message.connect(self.show_message)

        self.setLayout(hbox)

    def show_message(self, text):
        """
        It shows a message

        :param text: The text to be displayed
        """
        cursor = self.brower.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.brower.append(text)
        self.brower.setTextCursor(cursor)
        self.brower.ensureCursorVisible()

    def start_btn_click(self):
        """
        A function that is called when the start button is clicked.
        """
        self.thread_.start()

    def image_path_btn_click(self):
        """
        It opens a file dialog box to select the image file.
        """
        path = QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(), "Image File (*.jpg);;Image File (*.png)")
        self.image_path_in.setText(path[0])
        pixmap = QPixmap(path[0])
        self.image_label.clear()
        self.image_label.setPixmap(pixmap)

创建一个ColorWork类,继承自子线程QThread,将提取色卡的业务操作写到这个类中,和UI主线程分开处理保证不影响主线程的逻辑处理。

class ColorWork(QThread):
    message = pyqtSignal(str)

    def __init__(self, parent=None):
        """
        A constructor that initializes the class.

        :param parent: The parent widget
        """
        super(ColorWork, self).__init__(parent)
        self.working = True
        self.parent = parent

    def __del__(self):
        """
        A destructor. It is called when the object is destroyed.
        """
        self.working = False

    def run(self):
        """
        *|CURSOR_MARCADOR|*
        """
        try:
            image_path_in = self.parent.image_path_in.text().strip()
            set_color_num_in = self.parent.set_color_num_in.text().strip()
            if image_path_in == '' or set_color_num_in == '':
                self.message.emit('系统参数设置不能为空,请检查参数设置!')
                return
            colors_x = extcolors.extract_from_path(image_path_in, tolerance=12, limit=int(set_color_num_in))

            for turple_ in colors_x[0]:
                rgb_ = turple_[0]
                color_16 = ('{:02X}' * 3).format(rgb_[0], rgb_[1], rgb_[2])
                color_16 = ('#' + color_16)
                self.message.emit(color_16)
        except:
            traceback.print_exc()
            self.message.emit('系统运行出现错误,请检查相关参数是否正确!')

最后,我们按照main的标准处理方式,将整个页面应用启动起来就大功告成啦!

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = ColorUI()
    main.show()
    sys.exit(app.exec_())

下面使用一个动态图片简单演示一下提取色卡信息的处理过程。

提取色卡信息.gif

色卡提取器应用color-catch.zip已打包成exe文件,公众号内回复 ‘色卡提取器’ 获取百度网盘的下载链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础之SQLite数据库

Python与SQLite数据库 一、概述 对于非常简单的应用而言,使用文件作为持久化存储通常就足够了,但是大多数复杂的数据驱动的应用则需要全功能的关系数据库。 SQLite 的目标则是介于两者之间的中小系统。它量级轻、速度快,没有服务器&#xf…

数学辅导微信小程序设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把数学辅导管理与现在网络相结合,利用java技术建设数学辅导微信小程序,实现数学辅导的信息化。则对于进一步提高数学辅导管理发展,丰富数学辅导管理经验能起到不少的促进作用。 数学辅导微…

【python】 int、float、double与16进制字符串的互相转换

import structdef intToHex(num): # int转16进制return hex(num)[2:].upper()def hexToInt(hexString): # 16进制转intreturn int(hexString, 16)def floatToHex(floatValue): # float转16进制return struct.pack(>f, floatValue).hex().upper()def hexToFloat(hexString…

chloris.earth ——Chloris 全球生物量 2003 - 2019 数据平台

概述 Chloris 全球生物量 2003 - 2019 数据集提供了地球陆地木本植被生态系统地上生物量存量和变化的估计值。它涵盖 2003 年至 2019 年期间,按年度时间步长计算。全球数据集的空间分辨率约为 4.6 公里。 这些地图和数据集是通过结合来自星载卫星的多个遥感测量结果…

如何保证PCB孔铜高可靠?

PCB板上电路导通,都是靠线路或过孔来传导的,从PCB制造流程可以看出,PCB完成铜厚是由PCB基铜厚度加板电厚度加图电厚度三部分组成,PCB孔铜厚度,是在两个电镀流程中完成,即全板电镀孔铜的厚度加图形电镀孔铜厚…

k8s概念

文章目录k8s概念为什么叫他k8s以及谁开发的k8s是什么k8s特点时光回溯传统部署时代:虚拟化部署时代容器部署时代:容器的优点为什么需要k8s,他能做什么?Kubernetes 不是什么?k8s概念 为什么叫他k8s以及谁开发的 kubern…

EO.Web浏览器 v2023.0.18.0 for .NET -- EO.WebBrowser

.NET PDF 和 Web 浏览器从未如此简单 使用 PDF 文件生成/处理能力快速扩展您的 .NET 应用程序,或者将流行的 Chromium 浏览器引擎与广泛的自定义选项(如自定义资源加载器和 JavaScript 扩展)无缝集成用于 UI 或后台任务。 当前:v2…

steam搬砖项目,小白也能月入过万的副业项目

steam搬砖这个项目,我们做了3年了,项目很稳定。由于项目是轻资产,门槛低,按照我们的方法,只要你足够勤快,这是一个能帮你赚取人生的第一桶金的项目。 仅代表个人收益 steam项目原理就是:倒卖cs…

移动端异构运算技术 - GPU OpenCL 编程(基础篇)

一、前言 随着移动端芯片性能的不断提升,在移动端上实时进行计算机图形学、深度学习模型推理等计算密集型任务不再是一个奢望。在移动端设备上,GPU 凭借其优秀的浮点运算性能,以及良好的 API 兼容性,成为移动端异构计算中非常重要…

小巧有劲的按摩好手,能装兜里的护理工具,小鸟斗士筋膜枪体验

现在很多朋友为了身体健康,平时都会去做些简单的健身,因为之前长期不运动,所以健身后很容易有肌肉酸痛等问题,对此,筋膜枪是个很好用的工具,可以有效促进血液循环,还能够缓解久坐所导致的腰背酸…

java面试强基(16)

说说 List, Set, Queue, Map 四者的区别? List(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可…

壳寡糖/肉桂醛修饰乳清蛋白,乳清浓缩蛋白-羟丙基甲基纤维素复合材料

产品名称:壳寡糖修饰乳清蛋白 英文名称:Chitosan-whey protein 用途:科研 状态:固体/粉末/溶液 产品规格:1g/5g/10g 保存:冷藏 储藏条件:-20℃ 储存时间:1年 壳寡糖,又叫…

【图文详解】入职必备——SVN使用教程

一、SVN基本操作 1、进入svnbucket官网,创建一个空项目,学习svn 2、创建好测试项目后,复制对应地址 3、右键点击“SVN 检出” 4、粘贴“版本库URL”,填写“检出至目录”,最后点击“确定” 5、完善“用户名”和“密码”…

3.9、以太网交换机自学习和转发帧的流程

3.9、以太网交换机自学习和转发帧的流程 1.以太网交换机工作在数据链路层(也包括物理层) 说明:目前市场上也有包含网络层部分功能的交换机,称为三层交换机 2.以太网交换机收到帧后,在帧交换表中查找的目的MAC地址所…

cilantro 点云均值漂移算法(MeanShift)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 均值漂移算法是一种非常经典的层次聚类方式,已在二维图像中得到了广泛的应用。这里我们也已二维图像为例来阐述其整个计算过程: 算法基本思想:如下图所示,左侧为实际的图像特征的分布,右侧为基于图像特征分布计…

马斯克让猴子学会意念打字!还用人脑模型演示背后原理,电线入脑清晰可见...

杨净 Pine 发自 凹非寺量子位 | 公众号 QbitAI一鸽再鸽,马斯克Neuralink终于官宣新进展。果然不出所料,与此前大家预想的意念打字相关。不过get这项技能的不是人类,而是他们的老朋友——猴子。根据黄色提示“指哪打哪”:我可以吃点…

第 04 章_逻辑架构

第 04 章_逻辑架构1. 逻辑架构剖析1. 1 服务器处理客户端请求1.2 Connectors1.3 第 1 层:连接层1.4 第 2 层:服务层1. 5 第 3 层:引擎层1. 6 存储层1. 7 小结2. SQL执行流程2. 1 MySQL 中的 SQL执行流程3. 优化器 :4. 执行器 &…

Vue3 —— 怎样利用vite创建一个vue3项目

前言 本文主要讲解如何利用vitevue创建第一个项目以及vue3的基础知识点 一、创建一个vue3项目 这里我们主要介绍如何利用 vitevue3创建项目 1.有关vite Vite(法语意为 "快速的",发音 /vit/,发音同 "veet")是…

【目标检测】Faster R-CNN论文代码复现过程解读(含源代码)

目录:Faster R-CNN论文代码复现过程解读Faster R-CNN代码使用说明书(分享在github上)一、代码的地址二、我的配置环境三、参数值文件下载四、VOC数据集下载五、模型训练步骤(1)训练VOC0712数据集1.数据集的准备2.数据集…

做电商太难了。。

阅读本文大概需要 1.86 分钟。上周跟在杭州做电商的朋友交流了一下,发现他们太难了。前些天不还有说现在全国 65% 的快递网点都停摆了,这对电商影响非常大,最直接的就是物流快递的问题,一堆快递堆在那里发不出去。虽然直播间卖得算…