正如标题所示,我在这里有一段旧的python代码,它在之前的版本(2.7)中工作但现在不再存在了。 该代码定义了一个函数,该函数仅从包含0,1和2的给定数组创建一个RGB图像,其中三个颜色位于“colors”RGB元组数组中。 这是代码:
def create_image (A,n,name):
colors = [(0,128,0),(255,48,29),(48,48,48)]
colors = [''.join([chr(x)for x in color]) for color in colors]
img_str=''
for line in range(n):
for col in range(n):
img_str += colors [A[line][col]]
img = Image.fromstring('RGB',(n,n),img_str)
img.save(name)
return True
但是在最新版本中,它给出了以下错误消息:
Exception Traceback (most recent call last)
<ipython-input-61-c2af90f0caf4> in <module>()
----> 1 create_image(T,5,'test.png')
C:\Users\user\Desktop\Code test.py in create_image(A, n, b)
105 img_str += colors [A[line][col]]
--> 106 img = Image.fromstring('RGB',(n,n),img_str)
107 img.save(b)
C:\pyzo2015a\lib\site-packages\PIL\Image.py in fromstring(*args, **kw)
2075 def fromstring(*args, **kw):
2076 raise Exception("fromstring() has been removed. " +
-> 2077 "Please call frombytes() instead.")
2078
2079
Exception: fromstring() has been removed. Please call frombytes() instead.
如果有人能帮我解决这个问题,我将不胜感激。
答案 0 :(得分:0)
如上所述,Python 3字符串是Unicode字符串(而Python 2字符串是字节数组)。由于解释器无法将'bytes'对象隐式转换为str ,所以显式。
答案 1 :(得分:0)
Python 2中的普通字符串是简单的字节字符串,但在Python 3中它们是Unicode字符串。所以要在Python 3中进行这种字节级操作,你不能使用普通字符串,你需要使用Python 3 bytes
对象;还有一个bytearray
对象可用于这些类型的任务。
以下是一些代码,向您展示如何在Python 3中执行此任务所需的bytes
操作。
colors = [(0,128,0), (255,48,29), (48,48,48)]
colors = [bytes(color) for color in colors]
print(colors)
# Some fake image data
data = [[(u+v) % 3 for u in range(4)] for v in range(3)]
print(data)
# Three ways to convert the palette numbers in `data` to RGB bytes
# By concatenation
img_str = b''
for row in data:
for col in row:
img_str += colors[col]
print(img_str)
# By joining the RGB bytes objects
a = b''.join([colors[col] for row in data for col in row])
print(a)
# By splitting the RGB bytes objects and building
# a new bytes object of the whole image
b = bytes(k for row in data for col in row for k in colors[col])
print(b)
<强>输出强>
[b'\x00\x80\x00', b'\xff0\x1d', b'000']
[[0, 1, 2, 0], [1, 2, 0, 1], [2, 0, 1, 2]]
b'\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000'
b'\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000'
b'\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000\x00\x80\x00\xff0\x1d000'