文章目录
- tobytes()
- 生成带格式的二进制
以程序中生成的词云图为例(方便测试,我把生成图片调小了)
wc = WordCloud(font_path=font_path, scale=1, collocations=False, background_color='white',
width=40, height=30) # mask=back_coloring
wc.generate_from_frequencies(count_dict)
img = wc.to_image()
获取的img为PIL的Image对象,这里有两种方式生成二进制数据
tobytes()
直接将图片的三维数组转化为二进制
img_bytes = img.tobytes()
python可以很方便的读取生成的二进制数据,需要指定一下模式和size
img = Image.frombytes(mode="RGB",size=(40,30), data=data1[0])
但在java读起来并不方便,我尝试将字节输入流转化为int数组,然后BufferedImage.setRGB()
读取,图片可以显示,但是存在一些问题,之前白色的背景变为蓝色,图片内容也有一些改变,开始我以为是python三维数组到一维的方式不同导致的,从(30,40,3)
->(3,30,40)
发现都不行,java正常从本地读取一个png文件,getRGB
获取的数组中的数也看不太懂。这个目前还没有找到解决的方案。
BufferedImage image = new BufferedImage(40,30, BufferedImage.TYPE_INT_RGB);
image.setRGB(0,0,40,30, imgInt,0,40);
不得不说,人生苦短,我用python
生成带格式的二进制
原理就是调用Image的save方法,写入我们的内存中,写入的是压缩形式的二进制,带有格式信息
关于这个其实python没有java那么明确,java中有明确的InputStream
和OutputStream
,输出流生成时可以写入字节数组,当然python也可以实现把文件写入到字节数组,方法如下
output = BytesIO()
img.save(output, format='png')
hex_data = output.getvalue()
这里获取到的二进制数据java可以方便的读取,因为是带png格式的。
//这里从数据库读取图片的二进制流
BufferedImage image = ImageIO.read(in);
image.getRGB(0,0,40,30,rgbArray,0,40);
System.out.println(Arrays.toString(rgbArray));