蟒蛇保持在RAM中的图像不保存到硬盘驱动器?

时间:2019-08-03 19:38:15

标签: python image pygame python-imaging-library pyautogui

我制作了一个屏幕放大程序,这样我就可以用视力看到屏幕,并且做到了。

import pyautogui
import pygame
import PIL
from PIL import Image

pygame.init()

LocationLeft = 50
LocationTop = 50
LocationWidth = 100
LocationHeight = 100

Magnification = 3

gameDisplay = pygame.display.set_mode((LocationWidth * Magnification , LocationHeight * Magnification ))

crashed = False

ImageFileName="ScreenLarger.png"

try:
    while not crashed:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                crashed = True

        x, y = pyautogui.position()

        LocationLeft = x - 25
        LocationTop = y - 25

        im = pyautogui.screenshot(imageFilename=ImageFileName ,region=(LocationLeft,LocationTop, LocationWidth, LocationHeight))

        img = Image.open(ImageFileName)
        img = img.resize((LocationWidth * Magnification, LocationHeight * Magnification))
        img.save(ImageFileName)

        theimg = pygame.image.load(ImageFileName)

        gameDisplay.blit(theimg,(0,0))

        pygame.display.update()

except KeyboardInterrupt:
    print('\n')

它的效果很好,您可以使用它,问题是它每次迭代与硬盘驱动器交互4次,我认为这不是最佳做法,因为那些没有固态驱动器的驱动器会增加磨损和损坏。驾驶。那么如何将图像保存在其所属的RAM中?

1 个答案:

答案 0 :(得分:4)

那为什么要保存到文件中?

pyautogui.screenshot仅在传递文件名的位置保存到文件中,否则,将返回PIL.Image。只需不要求它将其保存到文件中即可。

Pygame具有功能pygame.image.fromstring(string, size, format, flipped=False) -> Surface

这样,您可以截取屏幕截图并将其转换为pygame表面:

screenshot = pyautogui.screenshot(region=(LocationLeft,LocationTop, LocationWidth, LocationHeight))
image = pygame.image.fromstring(screenshot.tobytes(), screenshot.size, screenshot.mode)

然后直接将其blit到屏幕上,而无需将其保存到文件中。

.tobytes()返回图像的原始字节,这是pygame称为“字符串”的东西,而与此不同的是,bytes是python库中全局存在的函数,因此word在处理二进制数据时,“字节”在没有遮蔽该函数的情况下通常不能真正用作变量名(仅在P​​ython中!)-string 表示 {{1} }。

.size返回图片的尺寸,这是pygame函数所期望的。

.mode返回图像的格式,pygame还需要从原始字节重建真实图像。

如果您不需要翻转图像(供您查找),则应使用pygame.image.frombuffer而不是pygame.image.fromstring,这样做会更快,因为它不会被复制任何数据,并将直接使用PIL图片字节。