在一些特殊的业务场景中,我们需要一次性提取一张图片中的色卡信息,并且需要使用十六进制的颜色表示方法进行展示。
今天得空做了一个小工具,用来自定义的提取某一张图片中的色卡信息,需要提取某张图片中的色卡可以自行选择。
实现过程就是比较简单的,主要是通过extcolors的python非标准库来实现的。
另外的python非标准库就是PyQt5的使用,还有os、sys等系统或文件操作模块。
没有安装上述几个python非标准库的话,我们直接使用pip的方式安装一下即可。
pipinstallPyQt5-ihttps://pypi.tuna.tsinghua.edu.cn/simple/ pipinstallextcolors-ihttps://pypi.tuna.tsinghua.edu.cn/simple/
在安装完成相关的模块之后,将我们需要的python模块导入到开发的代码块中。
#It'samodulethatallowsyoutoprintthestacktraceofanexception. importtraceback #It'samodulethatallowsyoutoprintthestacktraceofanexception. importextcolors #It'simportingalltheclassesfromtheQtWidgetsmodule. fromPyQt5.QtWidgetsimport* #It'simportingalltheclassesfromtheQtGuimodule. fromPyQt5.QtGuiimport* #It'simportingalltheclassesfromtheQtCoremodule. fromPyQt5.QtCoreimport* #It'simportingthesysmodule. import开发者_Go学习sys #It'simportingtheosmodule. importos
在代码块中创建ColorUI作为UI组件及布局的使用类,将UI相关的操作和槽函数全部放到这个类中进行处理。
classColorUI(QWidget): def__init__(self): """ Aconstructor.ItiscalledwhenanobjectiscjavascriptreatedfroMAClassanditallowstheclasstoinitializethe attributesofaclass. """ super(ColorUI,self).__init__() self.init_ui() definit_ui(self): """ ThisfunctioninitializestheUI. """ 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) defshow_message(self,text): """ Itshowsamessage :paramtext:ThesQfXQysfGHtexttobedisplayed """ cursor=self.brower.textCursor() cursor.movePosition(QTextCursor.End) self.brower.append(text) self.brower.setTextCursor(cursor) self.brower.ensureCursorVisible() defstart_btn_click(self): """ Afunctionthatiscalledwhenthestartbuttonisclicked. """ self.thread_.start() defimage_path_btn_click(self): """ Itopensafiledialogboxtoselecttheimagefile. """ path=QFileDialog.getOpenFileName(self,"选取文件",os.getcwd(),"ImageFile(*.jpg);;ImageFile(*.png)") self.image_path_in.setText(path[0]) pixmap=QPixmap(path[0]) self.image_label.clear() self.image_label.setPixmap(pixmap)
创建一个ColorWork类,继承自子线程QThread,将提取色卡的业务操作写到这个类中,和UI主线程分开处理保证不影响主线程的逻辑处理。
classColorWork(QThread): message=pyqtSignal(str) def__init__(self,parent=None): """ Aconstructorthatinitializestheclass. :paramparent:Theparentwidget """ super(ColorWork,self).__init__(parent) self.working=True self.parent=parent def__del__(self): """ Adestructor.Itiscalledwhentheobjectisdestroyed. """ self.working=False defrun(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() ifimage_path_in==''orset_color_num_in=='': self.message.emit('系统参数设置不能为空,请检查参数设置!') return colors_x=extcolors.extract_from_path(image_path_in,tolerance=12,limit=int(set_color_num_in)) forturple_incolors_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图片色卡提取器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论