Skip to main content
 首页 » 编程设计

python之将 QPixmap 转换为 Numpy

2024年10月17日32mfrbuaa

要将 numpy 矩阵转换为 QPixmap,我使用了这个函数:

def np2qpixmap(np_img): 
    frame = cv2.cvtColor(np_img, cv2.COLOR_BGR2RGB) 
    img = QtGui.QImage(frame, frame.shape[1], frame.shape[0], QtGui.QImage.Format_RGB888) 
    return QtGui.QPixmap.fromImage(img) 

现在如何进行逆运算?

请您参考如下方法:

这是我不久前为某个爱好项目编写的函数...

import copy 
import numpy as np 
 
def qt_image_to_array(img, share_memory=False): 
    """ Creates a numpy array from a QImage. 
 
        If share_memory is True, the numpy array and the QImage is shared. 
        Be careful: make sure the numpy array is destroyed before the image,  
        otherwise the array will point to unreserved memory!! 
    """ 
    assert isinstance(img, QtGui.QImage), "img must be a QtGui.QImage object"  
    assert img.format() == QtGui.QImage.Format.Format_RGB32, \ 
        "img format must be QImage.Format.Format_RGB32, got: {}".format(img.format()) 
 
    img_size = img.size() 
    buffer = img.constBits() 
 
    # Sanity check 
    n_bits_buffer = len(buffer) * 8 
    n_bits_image  = img_size.width() * img_size.height() * img.depth() 
    assert n_bits_buffer == n_bits_image, \ 
        "size mismatch: {} != {}".format(n_bits_buffer, n_bits_image)  
 
    assert img.depth() == 32, "unexpected image depth: {}".format(img.depth()) 
 
    # Note the different width height parameter order! 
    arr = np.ndarray(shape  = (img_size.height(), img_size.width(), img.depth()//8), 
                     buffer = buffer,  
                     dtype  = np.uint8) 
 
    if share_memory: 
        return arr 
    else: 
        return copy.deepcopy(arr)