在pygame中临时保存图像

Posted

技术标签:

【中文标题】在pygame中临时保存图像【英文标题】:Temporary save Image in pygame 【发布时间】:2020-10-18 06:06:42 【问题描述】:

我正在制作一个图像裁剪器,使用 pygame 作为界面,使用 opencv 进行图像处理。 我已经创建了crop(),colorfilter()等函数,但是我将图像加载为pygame.image.load()以在屏幕上显示它但是当我执行crop()时它是numpy.ndarray并且pygame无法加载它得到错误:

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

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

【问题讨论】:

见How do I convert an OpenCV (cv2) image (BGR and BGRA) to a pygame.Surface object 【参考方案1】:

以下函数将 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。

【讨论】:

感谢您的回答,这真的很容易解决了我的问题。 @Creeper2962 谢谢。你不客气。我希望解释 (link) 能帮助你理解它是如何工作的。 只有一个问题,我如何转换黑白图像,因为它具有 shape(x,y) 并且您的解决方案给出了“超出范围”错误。 @Creeper2962 我将对此进行调查并扩展答案。一会儿…… 我已使用 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 将其转换为灰色图像,其形状为 (x,y) 而不是 (x,y,1) 抱歉我的错字。

以上是关于在pygame中临时保存图像的主要内容,如果未能解决你的问题,请参考以下文章

pygame.transform.chop 不工作

在字典中存储多个图像文件

ASP.NET - 如何在浏览器中显示图像而不将图像保存在临时文件中?

MicroPython图像应用中,存图img是啥变量,怎么按位操作?

将解码的临时图像保存到 Django Imagefield

如何覆盖图库中的图像