‘‘‘
# This file is image_viewer.py. It is used with main_win.py, which comes from main_win.ui by
# pyuic5. This app uses PyQt5, so you need to install this package. It can extract some exif
# tags from image, you alse need exifread lib.
# And main_win.ui is designed by Qt‘s Designer, it‘s content is in Image Viewer-Ui.
# <PyQt5快速开发与实战.pdf> is referenced during it‘s design, and PIL.Image‘s doc also.
# Thank this book‘s author and doc‘s author/contributors.
# I will spare time to add some comment in code.
# "xxx\\xxx\\xx.txt" in code is a txt file that contains all kinds of EXIF tag.
# A tag occupies a line.
# xxx in ‘C:\\Users\\xxx\\Pictures‘ is user name on your computer.
‘‘‘
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog
from PyQt5.QtCore import QRect
from PyQt5.QtGui import QPainter, QPaintEvent, QPixmap
from main_win import Ui_MainWindow
import exifread
from PIL import Image, ImageQt
###
class tag_list():
#
def __init__(self, f):
self.tag = []
self.f_name = f
self.filter_str = [‘EXIF UserComment‘, ‘EXIF MakerNote‘]
#
def get_tag_list(self):
self.fd = self._open_file(self.f_name)
while(True):
c = self.fd.readline()
if c == ‘‘:
break
else:
self.tag.append(c.strip(‘\n‘))
self.fd.close()
return self.tag
#
def filter_tag(self, str_list):
pass
#
def _open_file_(self, f):
try:
fd = open(f, ‘r‘)
except Exception as e:
print(e)
return None
return fd
###
class image_viewer(QMainWindow, Ui_MainWindow):
#
def __init__(self, parent=None):
super(image_viewer, self).__init__(parent)
self.setupUi(self)
self.create_actions()
#
def create_actions(self):
self.actionFileOpen.triggered.connect(self.open_file)
self.actionFileClose.triggered.connect(self.close_file)
self.actionFileOpen2.triggered.connect(self.open_file)
#
def _open_file_(self):
try:
fd = open(self.img_file, ‘rb‘)
except Exception as e:
print(e)
return None
return fd
#
def get_tag_dict(self, fd):
self.tag = exifread.process_file(fd)
fd.close()
#
def get_img_size(self):
w = int(self.tag[‘EXIF ExifImageWidth‘].printable)
h = int(self.tag[‘EXIF ExifImageHeight‘].printable)
return (w, h)
#
def get_other_info(self):
t = tag_list(‘xxx\\xxx\\xx.txt‘)
s = t.get_tag_list()
r = []
for i in s:
e = ‘‘
if i in self.tag:
c = self.tag[i]
if isinstance(c, exifread.classes.IfdTag):
e += i
e += ‘ : ‘
e += str(c.printable)
r.append(e)
return r
#
def disp_info(self, t):
self.listWidget.clear()
self.listWidget.addItems(t)
#
def open_file(self):
img_file, ok = QFileDialog.getOpenFileName(self, ‘Open‘, ‘C:\\Users\\xxx\\Pictures‘, ‘Picture Files (*.jpg)‘)
self.img_file = img_file
if ok != ‘‘:
r = self._open_file_()
if r:
self.statusBar.showMessage(self.img_file)
self.get_tag_dict(r)
self.disp_img()
c = self.get_other_info()
self.disp_info(c)
else:
self.close_file()
print(‘Open file error !‘)
else:
self.close_file()
print(‘No file choosed ...‘)
#
def close_file(self):
self.labelPicDisp.clear()
self.listWidget.clear()
self.statusBar.clearMessage()
#
def paintEvent(self, event):
pass
#
def disp_img(self):
self.labelPicDisp.clear()
im = Image.open(self.img_file)
im.thumbnail((128, 128))
qt_image = ImageQt.ImageQt(im)
self.labelPicDisp.setPixmap(QPixmap.fromImage(qt_image))
im.close()
if __name__ = ‘__main__‘:
app = QApplication(sys.argv)
img_v = image_viewer()
img_v.show()
sys.exit(app.exec_())
原文:https://www.cnblogs.com/suohaicheng/p/11778639.html