是否可以从 BytesIO 对象读取 DICOM 文件?

问题描述

我在 Windows 上使用 python 3.6 从数据库中获取 DICOM 文件作为字节字符串。现在,我想使用 Pydicom 库来读取文件的内容。 dcmread() 方法将类文件对象作为主要参数,但是以下代码在尝试访问存储的图像时会引发错误:

import sqlite3 as sql,io

...
dicom_as_bytes = cursor.fetchone()[0] # read bytes from sqlite3 request
dicom_as_bytes = io.BytesIO(dicom_as_bytes) # convert to file-like format

dcm_file = dcmread(dicom_as_bytes)
images = dcm_file.pixel_array # PermissionError: [Errno 13] Permission denied: 'C:\\Users\\<User>\\AppData\\Local\\Temp\\tmpfhvgc2oo'

sql 请求本身没有问题,因为我能够写入持久文件并读取它:

tmp_file = open("tmp","wb")
tmp_file.write(dicom_as_bytes)
tmp_file.close()

dcm_file = dcmread("tmp")
images = dcm_file.pixel_array # no error

只要稍加搜索,就可以在 Internet 上找到免费的匿名 DICOM 文件。由于我不确定我是否有权链接我使用的那个,我不会在这里发布链接 - 抱歉。

这是 pydicom 方法的 dcmread 文档:link

上述方法有效。但是,我宁愿避免在项目文件夹中创建这样的临时文件。我还查看了 python 的 tempfile library,出于某种原因,它似乎对我也不起作用:

import tempfile

tmp_file = tempfile.NamedTemporaryFile()
temp_file.write(dicom_as_bytes)
temp_file.seek(0)

dcm_file = dcmread(temp_file)
images = dcm_file.pixel_array # TypeError: GDCM could not read DICOM image

temp_file.close()

最后,我想知道是否可以使用 BytesIOtempfile 从与 sqlite3 字节的数据完全对应的数据中加载 DICOM 文件的图像{1}} 和 sqlite3.Binary(open("file.dcm","rb).read()) 一个存储多个图像的 DICOM 文件。我宁愿不明确使用临时文件,因为我没有理由使用临时文件(没有内存不足、存储空间不足,我也没有进行进程间通信或崩溃恢复)。

我想知道在创建新的 "file.dcm" 对象或写入 BytesIO 之前是否需要以某种方式对接收到的字节进行编码。但是,情况似乎并非如此,因为我可以直接将它们写入带有 TemporaryFileopen(filename,mode).write(dicom_bytes) 的文件中。只是一方面,我可以访问图像数组,但另一方面不能访问(尽管我可以毫无问题地访问诸如 TemporaryFile().write(dicom_bytes) 之类的基本信息)。也许将 dcm_file.filename 对象转换为 BytesIO 对象会起作用,尽管我不知道如何在不使用 FileIO 创建新文件的情况下做到这一点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)