首页 > 解决方案 > 缩放时 PIL 图像到 Pygame 图像错误

问题描述

所以我有一张图片(16x16):

image = Image.open("image.png")

我将其转换为 pygame 图像:

mode = image.mode
data = image.tobytes()
py_image = pygame.image.fromstring(data, (64, 64), mode)

它给了我这个错误:

ValueError: String length does not equal format and resolution size

标签: pythonpygame

解决方案


问题是它fromstring()不会做你认为它做的事情,它不会缩放图像。它只能将数据流源化为原始数据流大小。因此,如果您正在输入16x16数据的像素,那么这就是fromstring()从字符串/字节流创建图像所需的大小。

这就是该功能的预期功能:

from PIL import Image
print(Image.open("test.png"))

它应该给你:

<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=64x64 at 0x2FCB6B8>

尺寸和模式很重要。您还应该将其用作输入向量,fromstring()因为大小可能会发生变化。

以下对我来说非常好:

from PIL import Image
import pygame

pygame.init()

gameDisplay = pygame.display.set_mode((800, 600))

image = Image.open("test.png")
mode = image.mode
data = image.tobytes('raw', mode)
py_image = pygame.image.fromstring(data, image.size, mode)

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

    gameDisplay.fill((255, 255, 255))
    gameDisplay.blit(py_image, (10, 10))

    pygame.display.update()

pygame.quit()

并产生:

在此处输入图像描述


如果要将小图像转换为更大的图像。您首先需要创建一个空白模板,您可以在其中读取数据。在这里,我将创建一个空白(白色)64x64像素图像,并将一个较小的图像移植/合并16x16到 position 的较大图像中0, 0

source = Image.open("test.png")
canvas = Image.new('RGB', (64,64), (255, 255, 255))
canvas.paste(source, (0, 0))

然后,您可以继续照常使用图像。尽管如此,这不会缩放它,它只会给你一个更大的画布来使用。如果要缩放图像,则应使用pygame.transform.scalePIL 缩放图像。


推荐阅读