如何解决如何给数字一个特定的颜色并使用 PIL 显示它?
我一直在开发基于图块的游戏,我想知道是否有一种方法可以仅从带有数字的文件制作地图。 我有一个文件“map.txt”,其中是代表每个图块的数字。这些数字(图块)根据图块具有不同的颜色。
例如:
0 0 1 1 1 1 0 1 2 2 2
0 1 2 2 1 1 0 0 0 1 0
0 0 1 1 1 1 0 1 2 2 2
0 - 黑色
1 - 黄色
2 - 绿色
我想使用 PIL 制作一个地图,其中每个图块都表示为一个像素并将其保存为图像。我已经看到它使用 pygame 完成,但我希望它只使用 PIL。
感谢回复。
解决方法
您可以通过使用带有 mode P
的图像来实现这一点,即使用 palette 的图像。
基本的工作流程是:
- 读取文本文件,将所有数字提取为一个连续列表。
- 根据行数和总数确定地图图像的宽度和高度。
- 使用
Image.new
创建一个模式为Image
的新P
对象。 - 使用
Image.putdata
从获得的数字列表中设置图像数据。 - 为所需的颜色数量设置合适的调色板,并使用
Image.putpalette
应用该调色板。
这就是完整的代码:
from PIL import Image
# Read map data from text file
with open('map.txt') as f:
lines = f.readlines()
# Extract numbers from map data to continuous list of integers
imdata = [int(x) for line in lines for x in line if x.isdigit()]
# Get image dimensions
h = len(lines)
w = len(imdata) // h
# Create new image of correct size with mode 'P',set image data
img = Image.new('P',(w,h),0)
img.putdata(imdata)
# Set up and apply palette data
img.putpalette([ 0,# Black
255,255,# Yellow
0,0]) # Green
# Save image
img.save('map.png')
而且,那将是输出图像:
如果您也愿意使用 NumPy,可以缩短代码:
import numpy as np
from PIL import Image
# Extract numbers from map data to NumPy array
imdata = np.loadtxt('map.txt').astype(np.uint8)
# Create new image from NumPy array with mode 'P'
img = Image.fromarray(imdata,'P')
# Set upand apply palette data
img.putpalette([ 0,0]) # Green
# Save image
img.save('map.png')
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1.1
NumPy: 1.20.2
Pillow: 8.2.0
----------------------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。