Python 缩放时PIL图像到Pygame图像错误

Python 缩放时PIL图像到Pygame图像错误,python,pygame,Python,Pygame,因此,我有一个图像(16x16): 我将其转换为pygame图像: mode = image.mode data = image.tobytes() py_image = pygame.image.fromstring(data, (64, 64), mode) 这给了我一个错误: ValueError:字符串长度不等于格式和分辨率大小 问题在于fromstring()没有做你认为它做的事情,它没有缩放图像。它只能将数据流源化为原始数据流大小。因此,如果您输入的是16x16像素的数据,这就是从

因此,我有一个图像(16x16):

我将其转换为pygame图像:

mode = image.mode
data = image.tobytes()
py_image = pygame.image.fromstring(data, (64, 64), mode)
这给了我一个错误:

ValueError:字符串长度不等于格式和分辨率大小

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

这就是该功能的作用方式:

从PIL导入图像
打印(Image.open(“test.png”))
它应该给你:


其中大小和模式非常重要。您还应该将其用作
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
图像移植/合并到位置
0,0
的较大图像中

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

然后,您可以继续按照正常方式使用图像。尽管如此,这不会缩放它,它只会给你一个更大的画布。如果要缩放图像,应使用或来缩放图像。

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

这就是该功能的作用方式:

从PIL导入图像
打印(Image.open(“test.png”))
它应该给你:


其中大小和模式非常重要。您还应该将其用作
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
图像移植/合并到位置
0,0
的较大图像中

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

然后,您可以继续按照正常方式使用图像。尽管如此,这不会缩放它,它只会给你一个更大的画布。如果要缩放图像,应使用或图像。

不能确定,但我几乎可以肯定
模式
可能与
tobytes()给出的字节不对应。最有可能的
模式是
RGBA
,数据在
RGB
中给出。尽管这可能是一个不正确的假设。关于这个主题的一些说明:也许
imgage.tobytes(“raw”,mode)
可以确保格式正确?tostring()已被删除,image.tobytes(“raw”,mode)不起作用。请查看我的帖子,因为它包含一些用于诊断问题的调试信息。您的代码应该可以很好地工作,正如下面我的代码(输出证明)一样。所以你的问题不在于代码,而在于图像。检查如何调试它,并让我知道
打印(Image.open())
的输出是什么:)不能确定,但我几乎可以肯定
模式
可能与
tobytes()
给出的字节不对应。最有可能的
模式是
RGBA
,数据在
RGB
中给出。尽管这可能是一个不正确的假设。关于这个主题的一些说明:也许
imgage.tobytes(“raw”,mode)
可以确保格式正确?tostring()已被删除,image.tobytes(“raw”,mode)不起作用。请查看我的帖子,因为它包含一些用于诊断问题的调试信息。您的代码应该可以很好地工作,正如下面我的代码(输出证明)一样。所以你的问题不在于代码,而在于图像。检查如何调试它,并让我知道打印(Image.open())
的输出是什么:)我知道我的图像是16x16,而不是64x64,但它必须是这样,因为在修改图像时它只显示图像。(将预览)无论图像大小,我都希望显示相同大小的所有图像。(也有不同大小的图片)@Yenz1我的意思是,这不是你要问的问题。你在问为什么会出现错误。这就是为什么。如果你想创建一个空白图像,然后将你的图像移植到更大的图像上(或缩放),这是一个完全不同的问题。哦,对不起,浪费了你的时间。@Yenz1我添加了一个你实际提问的例子。也就是说,“如何将小图像粘贴到大图像中,然后将其导入Pygame”:)请参见底部的编辑。在本例中,我使用了一个
16x16
源图像,并将其粘贴到
canvas
上,这是一个
64x64
空白的白色图像。我知道我的图像是16x16,而不是64x64,但它必须是,因为在修改图像时,它只显示图像。(将预览)无论图像大小,我都希望显示相同大小的所有图像。(也有不同大小的图片)@Yenz1我的意思是,这不是你要问的问题。你在问为什么会出现错误。这就是为什么。如果你想创建一个空白图像,然后将你的图像移植到更大的图像上(或缩放),这是一个完全不同的问题。哦,对不起,浪费了你的时间。@Yenz1我添加了一个你实际提问的例子。也就是说,“如何将小图像粘贴到大图像中,然后将其导入Pygame”:)请参见第页的编辑