如何正确打开要在QApplication中使用的12位tiff文件

问题描述

上下文:我正在创建一个应用程序,以使用PyQt5查看图像流。根据选择的文件夹,我将打开jpg图像或12位tiff图像。这些图像将转换为numpy数组,然后转换为QImages和Qpixmaps。

到目前为止,我完全能够打开jpg图像(全部为RGB),但是很难正确显示tiff图像。这些图像是12位单通道图像(因此,仅红色光或仅绿色光等)。我用来加载图像的代码如下(其中newImage是图像文件的路径):

img_arr = np.asarray(Image.open(newImage))
if newImage.split(".")[-1] in ["png","jpg"]:
    self.background_pixmap = Qpixmap.fromImage(QImage(img_arr.data,img_arr.shape[1],img_arr.shape[0],img_arr.strides[0],QImage.Format_RGB888))
else:
    self.background_pixmap = Qpixmap.fromImage(QImage(img_arr.data,QImage.Format_RGB444).convertToFormat(QImage.Format_Grayscale16))

此Qpixmap所在的类是QGraphicsView。我将在帖子末尾包含重现此代码所需的所有代码。照片以numpy数组状态打印时,看起来像这样:

array([[1004,942,1159,...,1036,989,911],[1074,1046,982,951,1047,1056],[1080,1174,1129,1078,1124,1101],[1400,1346,1261,1367,1547,1367],[1297,1184,1339,1362,1295,1506],[1373,1440,1370,1334,1429,1487]],dtype=uint16)

使用else语句中的代码显示tiff图像。这个最新版本(RGB444 + Grayscale16)是我能正确显示图像的最接近版本,但仍具有令人难以置信的颗粒感。

我已经尝试了QImage格式表中的各种组合,但是似乎都无法正常工作。下面是图像外观以及我实际得到的链接

图片

Original image opened with windows image viewer

不良图片

Image that appears when loaded in my application

基本上,我想知道是否有人知道哪种类型的格式才能最好地显示这种类型的图像?我需要尽可能清楚一些,因为它将用于硬件测试。

因此,很明显,现在我的软件中不仅有更多的代码,而且我相信您可以复制我在下面的代码中所做的工作。该程序基于另一个程序员展示的PyQt5程序,因此,如果有任何奇怪或不标准的情况,这很可能就是原因。在此之前,我从未接触过PyQt5,因此我对标准的设置方式完全陌生,我写的大部分内容都来自互联网。


class ImageViewer(QGraphicsView):
    def __init__(self,parent=None,pixmap=None):
        super(ImageViewer,self).__init__(parent,pixmap)
        
        self.scene = QGraphicsScene()
        self.scene.addpixmap(pixmap)
        self.setScene(self.scene)
        self.parent = parent

    def change_pixmap(self,event):
        self.scene.clear()
        self.scene.addpixmap(pixmap)
        self.scene.addpixmap(Qpixmap.fromImage(self.parent.image))

    def updateImage(self,newImage):
        img_arr = np.asarray(Image.open(newImage))
        if newImage.split(".")[-1] in ["png","jpg"]:
            self.background_pixmap = Qpixmap.fromImage(QImage(img_arr.data,QImage.Format_RGB888))
        else:
            self.background_pixmap = Qpixmap.fromImage(QImage(img_arr.data,QImage.Format_RGB444).convertToFormat(QImage.Format_Grayscale16))

        self.image = QImage(self.background_pixmap.size(),QImage.Format_ARGB32)
        self.change_pixmap(self.background_pixmap)

class ImageTester(QMainWindow):
    def __init__(self,image):
        super(ImageTester,self).__init__()
        # Main Window Set up
        self.setobjectName("MainWindow")
        self.resize(1000,800)
        self.centralWidget = QWidget(self)
        self.centralWidget.setobjectName("centralWidget")
        self.centralHLayout = QHBoxLayout(self.centralWidget)
        self.centralHLayout.setobjectName("centralHLayout")

        # Image Viewer Setup
        self.imageViewer = ImageViewer(self,image)
        self.imageViewer.setGeometry(image.rect())
        self.imageViewer.setDragMode(QGraphicsView.ScrollHandDrag)
        self.imageViewer.setobjectName("imageViewer")
    
        self.centralHLayout.addWidget(self.imageViewer)
        self.setCentralWidget(self.centralWidget)

    def changeImage(self,newImage):
        self.imageViewer.updateImage(newImage)


def main():
    app = QApplication(sys.argv)

    # Main Window
    window = ImageTester(sys.argv[1])
    window.show()  

    # Start app
    return sys.exit(app.exec_())


if __name__ == '__main__':
    main()

编辑: 我试图将图像仅加载为self.background_pixmap = Qpixmap(newImage),但它只是将文件加载为全白。所以那也不行。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)