更正用于创建Image的旧python代码

时间:2016-05-31 17:05:02

标签: python python-2.7 python-3.x

正如标题所示,我在这里有一段旧的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.

如果有人能帮我解决这个问题,我将不胜感激。

2 个答案:

答案 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'