簡體   English   中英

如何在不寫入磁盤的情況下將 numpy 數組編碼為 base64 編碼的 PNG?

[英]How do I encode a numpy array to a base64-encoded PNG without writing to disk?

我想將表示為 numpy 數組的圖像轉換為 base64 編碼的 PNG 字符串,而不是先將其作為文件寫入磁盤。

目標是通過 HTTP 發送此圖像,然后使用 Javascript 在瀏覽器中顯示圖像。 基本上試圖在不使用磁盤的情況下將 numpy 圖像數組發送到瀏覽器。

我在 python 方面很舒服,在 JS 方面很陌生。

我不想使用磁盤,也不想使用 tensorflow(它有一個相關的幫助 API)。

我嘗試過研究,但是將 numpy 數組轉換為 PNG 的所有東西似乎都想將其保存到磁盤。 我不知道如何避免磁盤 I/O。

許多創建文件的函數將接受io.StringIOio.BytesIO的實例,而不是文件名或文件 object。

Here's an example (in an ipython session) where I use numpngw.write_png (from numpngw , a package I wrote for creating PNG and animated PNG files from numpy arrays) to create a base64-encoded PNG file in a Python bytes object.

一、進口:

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 object,並將 PNG“文件”寫入其中。

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=='

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM