如何将numpy数组编码为base64编码的PNG而不写入磁盘?

2024-04-23 21:51:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将一个表示为numpy数组的图像转换为base64编码的PNG字符串,而不首先将其作为文件写入磁盘。你知道吗

我们的目标是通过HTTP发送,然后使用Javascript在浏览器中显示图像。基本上是在不使用磁盘的情况下将numpy图像数组发送到浏览器。你知道吗

在python方面我很舒服,在JS方面我很陌生。你知道吗

我不想使用磁盘,也不想使用tensorflow(它有一个相关的HelperAPI)。你知道吗

我试过研究,但是把numpy数组转换成PNG的所有东西似乎都想把它保存到磁盘上。我不知道如何避免磁盘I/O


Tags: 文件字符串图像numpyhttp目标编码png
1条回答
网友
1楼 · 发布于 2024-04-23 21:51:55

许多创建文件的函数将接受io.StringIOio.BytesIO的实例,而不是文件名或文件对象。你知道吗

下面是一个示例(在ipython会话中),我使用numpngw.write_png(来自^{},我为从numpy数组创建PNG和动画PNG文件而编写的包)在Python bytes对象中创建base64编码的PNG文件。你知道吗

第一,进口:

In [39]: import numpy as np                                                              

In [40]: from numpngw import write_png                                                   

In [41]: import io                                                                       

In [42]: import base64                                                                   

创建要使用的图像:

In [43]: img = np.random.randint(0, 256, size=(16, 16, 3)).astype(np.uint8)              

创建一个BytesIO对象,并将PNG“file”写入其中。你知道吗

In [44]: f = io.BytesIO()                                                                

In [45]: write_png(f, img)                                                               

f.getvalue()获取PNG“文件”中的字节。请看一下前12个字节:

In [46]: f.getvalue()[:12]                                                               
Out[46]: b'\x89PNG\r\n\x1a\n\x00\x00\x00\r'

最后,使用base64库中可用的许多编码之一对PNG数据进行编码:

In [47]: b64 = base64.b64encode(f.getvalue())                                            

In [48]: b64                                                                             
Out[48]: b'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAInRFWHRDcmVhdGlvbiBUaW1lADIwMTktMTAtMThUMDI6NDY6MTRayfRM7AAAAFF0RVh0U29mdHdhcmUAbnVtcG5ndyAodmVyc2lvbiAwLjAuOS5kZXYwKSwgaHR0cHM6Ly9naXRodWIuY29tL1dhcnJlbldlY2tlc3Nlci9udW1wbmd3aGhwYwAAAxtJREFUeJwBEAPv/AChDcGkLZrMNsaw4b5CRQk90PGcAA05N+8BH3rlSGZVLOn/vleX3mclnyfC1TXEOJYAfLtv7F3kSclGhnJDU93XTTWA2RcAutMYkETtG2kUZMWvbSDAxm0uSm8y0Do6gNQpANrN6Xt3cIoybwKclwb9jEQoIrdE6acAd4IoaaSEuH2mUIZ0tQ5plhBU61nCj7jBqQBQFH2x7wd5HR3IA5jo/jOrlalRhR2xgYRboyOl+MhIxExUhNjqEpz66SGJQNbUrWoAYQIWoEgFXiewRwACPUd35eo0DxDWYcrONkmj1fBGe03/JirvaJLQ79F7uAG2vrCXACLBrKntrzxPLoFa7Wgzl1nNEdo7Fenn7Jd+d2TAAMFELJTkhXAhUpQe3NyIjY9y+QD0Lmn11S/UYf4BcTqE3lMbbQ2iQpS1kcKOtbC2zjx7KovsK1M+JRIClOUzATlVnp8ANJS/zfP2ZTzR4dKjV2XfF3bxFs9Kk9qb+ilBHlBUSr2VA6CHxxVtcuvlkeiDvSA6AFQjA+Hd5vsgjgAcEUPkJx2SgqazSjXcSFFyQHqhgif47p3WOVM2lv0rWc4kSRwE5QCXsYTzOWusqZPbHxZSIWDvPjZcESUQ6FKZ4Pa0XFfdD2rLxp/4PF6w33k75h6uHpMAJWGC0yVRXBRW726WM9BAoX7+KjhLaJ6FhJ5aeRYL092uW8DxFwgPTq/evQg6PgOZAOWyz+saW+gMZukrMeZyQLQcQ5QMzX0sFXBtT7rAs9sEKUIx/HLH6wuTCd+zkzbvbAD6cNATGxklmLG15gwnLIX5bSCFD3wTAhDZwaXTdvUDt6LGc7oma5QfuVKUPGXtm7MAIghIuKbNd6S1wsqG6Ga/cB+wMJYklc5AG4dGzFnK+RbpACrQtchNn9v6o2zXJxjaAIaIY6VW1Db6VNeP/tXKHrusaqy1lssoVdSNGiDMo17vmM4EsTkqSkNMFAMct78+WQCb6h4CwetL6rzaQvUx03qW4GBgPbIEMe2MIS9l7D53VKdtUjhpl28zOqI5bW3YFN4cXne4IEUrgwAAAABJRU5ErkJggg=='

相关问题 更多 >