基于Python制作一个图片色卡提取器

 更新时间:2022年12月02日 09:11:07   作者:Sir 老王  
在一些特殊的业务场景中,我们需要一次性提取一张图片中的色卡信息,并且需要使用十六进制的颜色表示方法进行展示。本文就来用Python做个图片色卡提取器,感兴趣的可以尝试一下

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

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

实现过程就是比较简单的,主要是通过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_())

到此这篇关于基于Python制作一个图片色卡提取器的文章就介绍到这了,更多相关Python图片色卡提取器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django中的事务ATOMIC_REQUESTS

    Django中的事务ATOMIC_REQUESTS

    这篇文章主要介绍了Django中的事务ATOMIC_REQUESTS使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • scrapy在python爬虫中搭建出错的解决方法

    scrapy在python爬虫中搭建出错的解决方法

    在本篇文章里小编给大家整理了一篇关于scrapy在python爬虫中搭建出错的解决方法,有需要的朋友们可以学习参考下。
    2020-11-11
  • Jupyter Notebook 基本操作快捷键方式

    Jupyter Notebook 基本操作快捷键方式

    这篇文章主要介绍了Jupyter Notebook 基本操作快捷键方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python实现的生成自我描述脚本分享(很有意思的程序)

    Python实现的生成自我描述脚本分享(很有意思的程序)

    这篇文章主要介绍了Python实现的生成自我描述脚本分享,很有意思的程序,绕的人有点头晕,需要的朋友参考下吧
    2014-07-07
  • python中zip函数用法详解(全)

    python中zip函数用法详解(全)

    这篇文章主要给大家介绍了关于python中zip函数用法详解的相关资料,zip()是Python的一个内建函数,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Python数据分析入门之教你怎么搭建环境

    Python数据分析入门之教你怎么搭建环境

    本篇文章要有一定的Python基础,知道列表,字符串,函数等的用法. 文中有非常详细的代码示例,对正在入门python数据分析的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Python抖音无水印视频下载方法

    Python抖音无水印视频下载方法

    这篇文章主要介绍了用Python下载抖音无水印视频的方法,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Python学习笔记(一)(基础入门之环境搭建)

    Python学习笔记(一)(基础入门之环境搭建)

    本系列为Python学习相关笔记整理所得,IT人,多学无害,多多探索,激发学习兴趣,开拓思维,不求高大上,只求懂点皮毛,作为知识储备,不至于落后太远。本文主要介绍Python的相关背景,环境搭建。
    2014-06-06
  • Cpython解释器中的GIL全局解释器锁

    Cpython解释器中的GIL全局解释器锁

    这篇文章主要介绍了Cpython解释器中的GIL全局解释器锁的相关资料,帮助大家更好的了解Cpython解释器,感兴趣的朋友可以了解下
    2020-11-11
  • python机器学习GCN图卷积神经网络原理解析

    python机器学习GCN图卷积神经网络原理解析

    这篇文章主要为大家介绍了GCN图卷积神经网络原理及代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论