调整图像内容的大小,但保持图像尺寸

时间:2020-08-29 14:40:36

标签: python image pygame

我正在尝试使用PyGame在Python中创建基本的Pokemon副本。过去,我已经关注了一些有关此库的教程。因此,对于这个项目,我将拥有一个基本的瓷砖结构,无论是草还是水。不允许玩家移动到水板上,但可以在草板上自由移动。我通过本教程获得的Sprite尺寸为64 x 64,并且占据了图块的整个空间,因此边界周围没有透明像素。

但是,出于我的目的,我需要使用自己从精灵表中获得的精灵(64 x 64)。但是,在这种情况下,子画面的图像的上半部分只是透明的,未使用的像素。小精灵每侧的四分之一也是如此。因此,我需要通过沿两个轴将可见像素大小乘以2来批量调整所有这些精灵的大小。 IE,只需按比例因子2增加子画面大小即可。我可以轻松做到这一点, 但是 仍然无效,因为新的子画面大小为128 x 128,并且未使用像素的比例保持不变。

我的问题:

  • 我如何才能通过比例因子2调整精灵的大小,而仅通过放置在64 x 64帧之外的透明像素来保留64 x 64的原始尺寸?

我需要一种可以用于所有9600个Sprite的方法,最好是在Python中使用,即使我不介意其他软件的解决方案。

我尝试在网络上寻找解决方案,但我不知道如何正确表达这个问题。

3 个答案:

答案 0 :(得分:3)

创建一个空的pygame.Surface对象,该对象具有透明的Alpha,尺寸为32x32:

new_image = pygame.Surface((32, 32), pygame.SRCALPHA)

blit的所需区域(32、16、32、32)形成了新表面上原始的64x64 Sprite(original_image):

new_image.blit(original_image, (0, 0), (32, 16, 32, 32))

pygame.transform.smoothscale缩放新的Surface对象

new_image = pygame.transform.smoothscale(new_image, (64, 64))

答案 1 :(得分:1)

@ Rabbid76的答案是将原件的一部分复制/涂黑,然后放大/缩放,这是一个不错的选择,可能也是我的选择。

但是,如果您已经将它们调整为更大的尺寸,并且只想裁剪现有图像/表面的版本,则可以使用subsurface()。这将为您提供一个真正类似于虚拟表面的表面,该虚拟表面为原始表面的一个子部分提供了一个窗口。它引用与原始曲面相同的像素,因此,如果更改了一个像素,则在另一个曲面中也可以看到该像素。对于您正在做的事情,这似乎不是问题。

答案 2 :(得分:0)

如果这些是图像,则可以使用PIL轻松地完成此操作。

from PIL import Image

忽略此位,它只会生成64x64的测试图像

from scipy import misc
img = misc.face()

img=Image.fromarray(np.uint8(img))
img=img.resize((64,64))

这应该显示一只可爱的小浣熊

enter image description here

接下来,我们可以按照您所描述的那样将缩放比例调整为2(注意:我没有利用这是一个正方形图像这一事实,因此它更具通用性。您可以使用{{ 1}})

imsz=img.size[0] 

应该给出2倍的缩放图像

enter image description here

现在我们将其裁剪

imsz=img.size
# resize by factor of 2
img=img.resize((imsz[0]*2,imsz[1]*2))

这给了我们64x64的图像:

enter image description here