当我在QLabel上绘制Matplotlib子图时,我得到的颜色Map表与保存到文件时不同。我如何用QT显示真实的的颜色Map表?例如,在下面的代码中,磁盘上的图像具有良好的红蓝颜色Map表,但QT的颜色Map表是蓝暗橙子的。我尝试了其他QImage格式,但到目前为止效果不佳。
import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt5.QtGui import QImage, QPixmap
class Window(QMainWindow):
def __init__(self):
# window design
super().__init__()
self.setFixedSize(1000, 400)
# create QT element
self.wid_labelGraph = QLabel(self)
self.wid_labelGraph.setStyleSheet("background-color : white;")
self.setCentralWidget(self.wid_labelGraph)
self.make_graphs()
def make_graphs(self):
# generate graph
heatmaps = [ np.ones((50, 50)), np.zeros((50, 50)), -1 * np.ones((50, 50)) ]
fig, axs = plt.subplots(1, 3, figsize = (10, 4))
for i in range(3):
im = axs[i].imshow(heatmaps[i], cmap = 'RdBu_r', clim = (-1, 1))
axs[i].set_axis_off()
fig.colorbar(im, ax = axs.ravel().tolist())
fig.savefig('temp.png')
canvas = FigureCanvas(fig)
canvas.draw()
width, height = fig.figbbox.width, fig.figbbox.height
img = QImage(canvas.buffer_rgba(), width, height, QImage.Format_ARGB32)
self.wid_labelGraph.setPixmap(QPixmap(img))
# free memory
plt.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
app.exec()
1条答案
按热度按时间drkbr07n1#
格式错误。
您正在使用
Format_ARGB32
:图像使用32位ARGB格式(0xAARRGGBB)存储。
但是,正如函数名
buffer_rgba()
所示,格式是rgba,因此Format_RGBA8888
:该图像使用32位字节顺序RGBA格式(8-8-8 -8)存储。与ARGB 32不同,这是一种字节顺序格式,这意味着32位编码在大端和小端体系结构之间不同,分别为(0xRRGGBBAA)和(0xAABBGGRR)。如果读取为字节0xRR、0xGG、0xBB、0xAA,则颜色的顺序在任何体系结构上都是相同的。
您得到了错误的颜色,因为引用组件的位被 * 移位 *:红色被解释为α、绿色为红色、蓝色被解释为绿色、α被解释为蓝色。