Как разобрать и сохранить ответ Multipart/related type=image/jpeg? (Ответ Dicom Wado)
Я делаю запрос Get на сервер Dicom, который возвращает Multipart/Related Type=image/jpeg. Я попытался использовать функцию aiohttp libararies Multipart для синтаксического анализа, но она не сработала. Сохраненный файл поврежден.
Вот мой код.
import asyncio
import aiohttp
'''
async def fetch(url,session,header):
async with session.get(url,headers=header) as response:
await response
async def multiHit(urls,header):
tasks = []
async with aiohttp.ClientSession() as session:
for i,url in enumerate(urls):
tasks.append(fetch(url,session,header))
result = await asyncio.gather(*tasks)
return result
loop = asyncio.get_event_loop()
res = loop.run_until_complete(multiHit(["FRAME URL"],{"Accept":"multipart/related;type=image/jpeg"}))
print(res)
'''
async def xyz(loop):
async with aiohttp.ClientSession(loop=loop).get(url="FRAME URL",headers={"Accept":"multipart/related;type=image/jpeg"}) as response:
reader = aiohttp.MultipartReader.from_response(response)
while True:
part = await reader.next()
if part is None:
break
filedata = await part.read(decode=False)
import base64
with open('m.jpeg','wb') as outFile:
outFile.write(part.decode(filedata))
return 1
loop = asyncio.get_event_loop()
res = loop.run_until_complete(xyz(loop))
Как разобрать ответ Multipart/related и сохранить изображения?
1 ответ
Решение
Я понял, что правильно разбираю ответ, состоящий из нескольких частей, но мне пришлось использовать другую библиотеку (имя библиотеки: imagecodecs, имя метода: jpegsof3_decode), чтобы распаковать отдельные части в изображения. Это дает большой массив изображения. Вот обновленный код
reader = aiohttp.MultipartReader.from_response(response)
while True:
part = await reader.next()
if part is None:
break
data = await part.read()
imageDecompressed = jpegsof3_decode(data)
Далее массив numpy можно преобразовать в изображение с помощью cv2 libray
success, encoded_image = cv2.imencode('.png',imageDecompressed)
Таким образом можно получить байтовую версию преобразованного изображения.
imageInBytes = encoded_image.tobytes()