python - 缩放时 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
解决方案
问题是它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.scale或PIL 缩放图像。
推荐阅读
- php - 控制器中的 Foreach 问题 - CodeIngiter
- sql - MS SQL 似乎缓存了选择结果
- r - 'unlist' 将有序因子转换为 R 中的因子是否有原因?(当有序因子是列表的元素时)
- twitter-bootstrap - 使用 Sails.js 将 Boostrap 导航项设置为“活动”
- c - C中的搜索算法
- r - match.arg(position) 中的错误:'arg' 必须为 NULL 或呈现国家表中的字符向量
- amazon-web-services - 尽管调用权限配置得当,但 Cognito “PreSignUp 调用因配置而失败”
- mysql - Mysql 表数据未显示在使用 Nodejs 的 Angular 材料表上
- c++ - 从 MAP 中的 C++ 文件中读取键值对(Json 格式)
- python - 是否可以创建以列表中的值命名的对象?