加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 使用PIL将二进制字符串转换为图像

发布时间:2020-12-20 13:43:10 所属栏目:Python 来源:网络整理
导读:所以,我要做的是让PIL根据二进制字符串创建一个图像. 一些背景故事: from PIL import Imagevalue = "0110100001100101011011000110110001101111"vdiv = [value[i:i+8] for i in range(0,len(value),8)] ^这将从二进制字符串中创建一个字节列表. [‘01101000
所以,我要做的是让PIL根据二进制字符串创建一个图像.
一些背景故事:

from PIL import Image

value = "0110100001100101011011000110110001101111"
vdiv = [value[i:i+8] for i in range(0,len(value),8)]

^这将从二进制字符串中创建一个字节列表. [‘01101000′,’01100101’,…..]

def diff(inp):
    if inp == '1':
        return (0,0)
    if inp == '0':
        return (255,255,255)
    else:
        pass

^这会返回每个相应位的颜色元组,如果我调用:

for i in vdiv:
    for i2 in i:
        print diff(i2)

它将为列出的字节中的每个位打印每个颜色元组. (0,0)(0,0)(255,255)……

我想知道的是,如何让PIL创建像素与二进制字符串匹配的图像?

这是它应该是什么样子:

到目前为止我对PIL的看法:

img = Image.new( 'RGB',(8,len(vdiv)),"white")
pixels = img.load()

##
for x in range(img.size[0]):
    for y in range(img.size[1]):
        for i in vdiv:
            for i2 in i:
                pixels[x,y] = diff(i2) #Creates a black image. What do?
##

img.show()

它是我在范围内的x位.我搞不清楚了.

解决方法

你可以使用img.putdata:

import Image

value = "0110100001100101011011000110110001101111"

cmap = {'0': (255,255),'1': (0,0)}

data = [cmap[letter] for letter in value]
img = Image.new('RGB',len(value)//8),"white")
img.putdata(data)
img.show()

如果你有NumPy,你可以使用Image.fromarray:

import Image
import numpy as np

value = "0110100001100101011011000110110001101111"

carr = np.array([(255,(0,0)],dtype='uint8')
data = carr[np.array(map(int,list(value)))].reshape(-1,8,3)
img = Image.fromarray(data,'RGB')
img.save('/tmp/out.png','PNG')

但是这个timeit测试建议使用putdata更快:

value = "0110100001100101011011000110110001101111"*10**5

def using_fromarray():
    carr = np.array([(255,dtype='uint8')
    data = carr[np.array(map(int,3)
    img = Image.fromarray(data,'RGB')
    return img

def using_putdata():
    cmap = {'0': (255,0)}

    data = [cmap[letter] for letter in value]
    img = Image.new('RGB',"white")
    img.putdata(data)
    return img
In [79]: %timeit using_fromarray()
1 loops,best of 3: 1.67 s per loop

In [80]: %timeit using_putdata()
1 loops,best of 3: 632 ms per loop

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读