Python 玩转wordcloud词云图片格式转化

发布时间:2021-12-03 公开文章

背景

在web开发过程中,遇到图片问题,我的原则是能不保存在服务器端就不要占用服务器的空间,虽然较其他而言空间是廉价滴。于是,能以base64直接在HTML端展示,是最好的选择。

 

方案

root_path = os.getcwd()
back_img  = np.array(Image.open(root_path+"\\mohurd01124\\background.jpg"))  # 采用不同尺寸的jpg,调整对应的max_font_size
image_colors = ImageColorGenerator(back_img)
wc = WordCloud(font_path="simhei.ttf",background_color="white", mask=back_img,scale=4,
           max_font_size=****, width=****, height=****,max_words=****)
wc.generate_from_frequencies(word_counts)
im= wc.recolor(color_func=image_colors)

1.常规做法,保存到本地或者服务器,然后在进行调用。(图床)

img_full_path=os.path.join(os.getcwd(), 'mohurd01124\\' +'res.jpg')
im.to_file(img_full_path)  # 保存词云路径

2.在plotlib中显示

plt.figure()
plt.imshow(im, interpolation="bilinear")
plt.axis("off")
plt.show()

图片大小可以通过设置plt窗口大小调整。

3.RGB与RGBA矩阵之间的转换

matrix_RGB = im.to_array()
image = Image.fromarray(matrix_RGB)
image

有些库在加载图片时,可以使用RGBA矩阵,例如Boken就可以通过p.image_RGBA()实现。

 

4.二进制转换

# PIL转二进制
bytesIO = BytesIO()
image.save(bytesIO, format='PNG')
bytesIO.getvalue()

 

5.Base64格式转换

from IPython.display import HTML
import base64

# Convert Image to Base64 
def im_2_b64(image):
    buff = BytesIO()
    image.save(buff, format="JPEG")
    img_str = base64.b64encode(buff.getvalue())
    img_str = str(img_str, "utf-8")
    return img_str

img_str = im_2_b64(image)

HTML('''<img src="data:image/JPEG;base64,{}">'''.format(img_str))

 

背景

网站一个新功能需要用到网址转换二维码,不需要花里胡哨的功能, 也不需要保存到服务器占用1B空间,用户需要即传输图片字节集。

需要安装myqr库,这个作者比较懒,我就顺头摸瓜,重新构造一下!

pip install myqr  -i https://pypi.tuna.tsinghua.edu.cn/simple 

 

代码

Talk is cheap

 

from MyQR.mylibs import data, ECC, structure, matrix, draw
from PIL import Image
from io import BytesIO
import base64
def get_qrcode(url,scale=1):
    ver=1
    ecl='H'
    ver, data_codewords = data.encode(ver, ecl, url)
    ecc = ECC.encode(ver, ecl, data_codewords)
    final_bits = structure.structure_final_bits(ver, ecl, data_codewords, ecc)
    qrmatrix = matrix.get_qrmatrix(ver, ecl, final_bits)
    unit_len = 3

    x = y = 4*unit_len
    pic = Image.new('1', [(len(qrmatrix)+8)*unit_len]*2, 'white')
    def draw_a_black_unit(p, x, y, ul):
        for i in range(ul):
            for j in range(ul):
                p.putpixel((x+i, y+j), 0)    
    for line in qrmatrix:
        for module in line:
            if module:
                draw_a_black_unit(pic, x, y, unit_len)
            x += unit_len
        x, y = 4*unit_len, y+unit_len
    size = (pic.size[0]*scale,pic.size[1]*scale)
    return pic.resize(size,Image.ANTIALIAS)
def im_2_b64(image):
    buff = BytesIO()
    image.save(buff, format="JPEG")
    img_str = base64.b64encode(buff.getvalue())
    img_str = str(img_str, "utf-8")
    return img_str

 

 

 

 

结语

'茴'字有多重写法,编程也是如是,实现一个功能的方法有多重,不见得都要掌握,但是可以在了解的过程中思考,找到一个最优的方案。最近在使用Pandas进行数百万条数据进行分析时,发现一些实用的技巧(不是python慢,而是方法不得当)。