Как мне кодировать массив numpy в PNG-кодировку base64 без записи на диск? - PullRequest
0 голосов
/ 18 октября 2019

Я хочу преобразовать изображение, представленное в виде пустого массива, в строку PNG в кодировке base64 без предварительной записи его в виде файла на диск.

Цель состоит в том, чтобы отправить его по HTTP, изатем отобразите изображение в браузере, используя Javascript. По сути, я пытаюсь отправить массив пустых изображений в браузер без использования диска.

Мне очень удобно со стороны Python, и я совершенно незнаком со стороной JS.

Я не хочуиспользовать диск, и я не хочу использовать tenorflow (у которого есть связанный вспомогательный API).

Я попытался исследовать, но все, что преобразует массив Numpy в PNG, похоже, хочет сохранить его вдиск. Я не знаю, как избежать дискового ввода-вывода.

1 Ответ

1 голос
/ 18 октября 2019

Многие функции, создающие файлы, будут принимать экземпляр io.StringIO или io.BytesIO вместо имени файла или объекта файла.

Вот пример (в сеансе ipython), где я использую numpngw.write_png (из numpngw, который я написал для создания файлов PNG и анимированных файлов PNG из массивов numpy) для создания файла PNG в кодировке base64 в объекте Python bytes.

Сначала,импорт:

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-файла.

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