0
点赞
收藏
分享

微信扫一扫

python将图片生成二进制的两种方式(java读取)


文章目录

  • ​​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));


举报

相关推荐

0 条评论