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慢,而是方法不得当)。