Изображение PIL для ошибки изображения Pygame при масштабировании - PullRequest
0 голосов
/ 17 июня 2020

Итак, у меня есть изображение (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

1 Ответ

1 голос
/ 17 июня 2020

Проблема в том, что 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()

И производит:

enter image description here


Если вы хотите преобразовать маленькое изображение в большее. Сначала вам нужно создать пустой шаблон, в который вы сможете считывать данные. Здесь я создам пустое (белое) изображение размером 64x64 пикселей и трансплантирую / объединяю меньшее изображение 16x16 с большим в позиции 0, 0.

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

Затем вы можете продолжить использовать изображение как обычно. В любом случае, это не будет масштабировать , это только даст вам больший холст для работы. Если вы хотите масштабировать изображение, вы должны использовать pygame.transform.scale или PIL scale изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...