放大QGraphicsView的比例时如何保持像素图的分辨率

问题描述

我可以放大像素图的比例并保持像素图的分辨率清晰。

使用 fitzpdfpage 重新加载更高分辨率的像素图并替换旧的像素图

但是当我放大 QGraphicsView 的比例时,像素图变得模糊。

当我缩放视图时,我不知道如何用新的和更高分辨率的像素图替换旧的像素图。

最少代码(需要你打开一个PDF文件

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 (将#修改为@)