pyqt5 使用sqlite3读取图片储存到数据库中以及从数据库中读取图片显示

该文章展示了如何利用PyQt5创建GUI界面,结合SQLite3数据库进行图片的存储和读取操作。用户可以选择图片保存到数据库,然后从数据库中读取并显示。主要涉及的函数包括QFileDialog用于选择文件,cv2处理图片,以及Qt的数据库和GUI组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

界面代码

这一部分是直接生成的,具体可以参考我的其他博客
大致界面如下,中间“IMG SHOW”是待会用来显示数据库中的图片的,两个按钮分别是打开图片储存到数据库中和从数据库中读取图片进行显示
在这里插入图片描述

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Finger_UI.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(773, 529)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_OpenFile = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_OpenFile.setGeometry(QtCore.QRect(150, 300, 131, 41))
        self.pushButton_OpenFile.setObjectName("pushButton_OpenFile")
        self.label_ShowImg = QtWidgets.QLabel(self.centralwidget)
        self.label_ShowImg.setGeometry(QtCore.QRect(230, 30, 251, 221))
        self.label_ShowImg.setAlignment(QtCore.Qt.AlignCenter)
        self.label_ShowImg.setObjectName("label_ShowImg")
        self.pushButton_read_db = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_read_db.setGeometry(QtCore.QRect(420, 300, 131, 41))
        self.pushButton_read_db.setObjectName("pushButton_read_db")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 773, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_OpenFile.setText(_translate("MainWindow", "打开文件夹"))
        self.label_ShowImg.setText(_translate("MainWindow", "IMG SHOW"))
        self.pushButton_read_db.setText(_translate("MainWindow", "读取数据库"))

主函数

主函数部分比较清晰的纪录了如何在pyqt中使用sqlite3,可以直接看代码,不进行过多讲解。

from PyQt5 import QtWidgets,QtCore,QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtSql import QSqlDatabase,QSqlQuery,QSqlTableModel
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox,QTableView

import sys
import cv2
import base64
import sqlite3

import Finger_UI


class Main_window(QtWidgets.QMainWindow,Finger_UI.Ui_MainWindow):
    def __init__(self,parent=None):
        super(Main_window,self).__init__(parent)
        self.setupUi(self)

        self.db_connect()
        self.createTable()

        self.pushButton_OpenFile.clicked.connect(self.open_save)
        self.pushButton_read_db.clicked.connect(self.show_img)

    def db_connect(self):
        self.conn = sqlite3.connect('./test.db')
        self.cursor = self.conn.cursor()

    def createTable(self):
        table_name = "pictureTable"
        self.cursor.execute(
            "create table IF NOT EXISTS %s(picName TEXT,width INTEGER, height INTEGER, image_bytes BLOB)"
                   % table_name)
        self.conn.commit()

    def save_img2db(self,img_name_path):
        image = cv2.imread(img_name_path)
        # 获取图像的宽度和高度
        height, width, _ = image.shape
        # 将图像编码为 PNG 格式的字节数据
        retval, encoded_image = cv2.imencode(".jpg", image)
        content = base64.b64encode(encoded_image)
        # 插入图片的二进制数据和相关信息
        name = img_name_path.split('/')[-1]
        sql = f"INSERT INTO pictureTable (picName, width, height, image_bytes) VALUES (?, ?, ?, ?);"
        self.cursor.execute(sql, (name, width, height, content))
        self.conn.commit()

    def read_img_from_db(self):
        sql = f"SELECT image_bytes FROM pictureTable WHERE picName=?"
        self.cursor.execute(sql, ('test.jpg',))
        value = self.cursor.fetchone()
        if value:
            img_data = base64.b64decode(value[0])
            # 如果是用cv2显示还需要做的处理
            # 将open方法读取的字节码转为opencv格式的数据
            # nparr = np.fromstring(img_data, np.uint8)
            # img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
            return img_data
        else:
            return None


    def show_img(self):
        img_data = self.read_img_from_db()
        if img_data:
            pixmap = QtGui.QPixmap()
            pixmap.loadFromData(img_data)
            scaled_pixmap = pixmap.scaled(self.label_ShowImg.size(), QtCore.Qt.AspectRatioMode.KeepAspectRatio)
            self.label_ShowImg.setPixmap(scaled_pixmap)
        else:
            QMessageBox.warning(self, 'Image Retrieval', 'No image found in the database.')


        # 如果直接从文件读取用这种方式显示
        # img = QtGui.QPixmap(imgName).scaled(self.label_ShowImg.width(), self.label_ShowImg.height())
        # self.label_ShowImg.setPixmap(img)


    # 窗口关闭时关闭数据库
    def closeEvent(self, QCloseEvent):
        self.conn.close()

    def open_save(self):
        imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
        if imgName:
            self.save_img2db(imgName)




    def open_file(self):
        fileName1, filetype = QFileDialog.getOpenFileName(self,
                                                          "选取模板文件文件",
                                                          "./",
                                                          "All Files (*);;Text Files (*.txt)")  # 设置文件扩展名过滤,注意用双分号间隔
        print("fileName1:",fileName1, filetype)








if __name__ == '__main__':
    app = QApplication(sys.argv)
    mytest = Main_window()
    mytest.show()
    app.exec_()

效果展示

运行主函数

读取图片存入

点击“打开文件夹”,选择一个图片,读取后,就可以在数据库中看到
在这里插入图片描述
数据库界面看到的
在这里插入图片描述

读取图片并显示

点击“读取数据库后,就可以直接从数据库中读取对应文件”,详情看主函数代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玛卡巴卡_qin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值