微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何给数字一个特定的颜色并使用 PIL 显示它?

如何解决如何给数字一个特定的颜色并使用 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')

而且,那将是输出图像:

Map

如果您也愿意使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?