问题描述
我可以放大像素图的比例并保持像素图的分辨率清晰。
使用 fitz
从 pdfpage 重新加载更高分辨率的像素图并替换旧的像素图
但是当我放大 QGraphicsView 的比例时,像素图变得模糊。
当我缩放视图时,我不知道如何用新的和更高分辨率的像素图替换旧的像素图。
import sys
from PyQt5.QtWidgets import QGraphicsScene,QGraphicspixmapItem,QFileDialog,QWidget
from PyQt5 import QtGui,QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QImage,Qpixmap
from PyQt5.QtWidgets import QGraphicsView,QApplication
from fitz import fitz
def pixmap_page_load(doc,pagenum,ratio=1):
page = doc.load_page(pagenum)
pix = page.getpixmap(matrix=fitz.Matrix(ratio,ratio))
fmt = QImage.Format_RGBA8888 if pix.alpha else QImage.Format_RGB888
pageImage = QImage(pix.samples,pix.width,pix.height,pix.stride,fmt)
pixmap = Qpixmap()
pixmap.convertFromImage(pageImage)
return Qpixmap(pixmap)
class PageInfo:
def __init__(self,PDFpath,pagenum=0,ratio=1):
self.doc = fitz.open(PDFpath)
self.pagenum = pagenum
self.ratio = ratio
self.pagepixmap = pixmap_page_load(self.doc,self.pagenum,ratio=ratio)
class PageView(QGraphicspixmapItem):
def __init__(self,pageinfo: 'PageInfo'):
super().__init__(pageinfo.pagepixmap)
self.pageinfo = pageinfo
self._delta = 0.1
self.ratio = 1
self.width = self.pixmap().width()
self.height = self.pixmap().height()
def wheelEvent(self,event):
if event.delta() > 0:
self.zoomIn()
else:
self.zoomOut()
def zoomIn(self):
self.ratio = self.ratio * (1 + self._delta)
self.zoom(self.ratio)
def zoomOut(self):
self.ratio = self.ratio / (1 + self._delta)
self.zoom(self.ratio)
def zoom(self,factor):
if factor < 0.07 or factor > 100:
# 防止过大过小
return
p = pixmap_page_load(self.pageinfo.doc,self.pageinfo.pagenum,ratio=factor* self.pageinfo.ratio)
self.setpixmap(p)
self.width = self.pixmap().width()
self.height = self.pixmap().height()
self.update()
def boundingRect(self):
return QtCore.QRectF(0,self.width,self.height)
pass
class PDFView(QGraphicsView):
def __init__(self,scene: 'QGraphicsScene'):
super().__init__(scene)
self.reset_ratio_value = 1
self._delta = 0.1
self.setDragMode(self.ScrollHandDrag)
directory,_ = QFileDialog.getopenFileName(self,".",filter="(*.pdf)")
self.scene().addItem(PageView(PageInfo(PDFpath=directory)))
self.show()
def wheelEvent(self,event: QtGui.QWheelEvent) -> None:
print("here")
modifiers = QApplication.keyboardModifiers()
if modifiers == Qt.ControlModifier:
if event.angleDelta().y() > 0:
self.scale(1.1,1.1)
self.reset_ratio_value *= 1.1
else:
self.scale(1 / 1.1,1 / 1.1)
self.reset_ratio_value /= 1.1
super().wheelEvent(event)
pass
if __name__ =="__main__":
app = QApplication(sys.argv)
clipper = PDFView(QGraphicsScene())
sys.exit(app.exec_())
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)