在pygame中临时保存图片

问题描述

我正在使用pygame作为界面和opencv进行图像裁剪。 我已经创建了诸如crop(),colorfilter()等函数,但是我将图像加载为pygame.image.load()以便在屏幕上显示,但是当我执行crop()时,它是numpy.ndarray,而pygame无法加载它而出现错误

参数1必须是pygame.Surface,而不是numpy.ndarray

我该如何解决这个问题。我需要blit()裁剪的图像。应该保存图像并阅读它,然后在完成后将其删除,因为我想应用多个过滤器。

解决方法

以下函数将OpenCV(cv2)图像分别从numpy.array(相同)转换为pygame.Surface

import numpy as np
def cv2ImageToSurface(cv2Image):
    if cv2Image.dtype.name == 'uint16':
        cv2Image = (cv2Image / 256).astype('uint8')
    size = cv2Image.shape[1::-1]
    if len(cv2Image.shape) == 2:
        cv2Image = np.repeat(cv2Image.reshape(size[1],size[0],1),3,axis = 2)
        format = 'RGB'
    else:
        format = 'RGBA' if cv2Image.shape[2] == 4 else 'RGB'
        cv2Image[:,:,[0,2]] = cv2Image[:,[2,0]]
    surface = pygame.image.frombuffer(cv2Image.flatten(),size,format)
    return surface.convert_alpha() if format == 'RGBA' else surface.convert()

有关该功能的详细说明,请参见How do I convert an OpenCV (cv2) image (BGR and BGRA) to a pygame.Surface object