问题描述
我在 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()
最后,我想知道是否可以使用 BytesIO
或 tempfile
从与 sqlite3
字节的数据完全对应的数据中加载 DICOM 文件的图像{1}} 和 sqlite3.Binary(open("file.dcm","rb).read())
一个存储多个图像的 DICOM 文件。我宁愿不明确使用临时文件,因为我没有理由使用临时文件(没有内存不足、存储空间不足,我也没有进行进程间通信或崩溃恢复)。
我想知道在创建新的 "file.dcm"
对象或写入 BytesIO
之前是否需要以某种方式对接收到的字节进行编码。但是,情况似乎并非如此,因为我可以直接将它们写入带有 TemporaryFile
或 open(filename,mode).write(dicom_bytes)
的文件中。只是一方面,我可以访问图像数组,但另一方面不能访问(尽管我可以毫无问题地访问诸如 TemporaryFile().write(dicom_bytes)
之类的基本信息)。也许将 dcm_file.filename
对象转换为 BytesIO
对象会起作用,尽管我不知道如何在不使用 FileIO
创建新文件的情况下做到这一点。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)