def loadDicomZip(filename, statusfunc=lambda s, c, n: None): series = {} count = 0 with zipfile.ZipFile(filename) as z: names = z.namelist() numfiles = len(names) for n in names: nfilename = '%s?%s' % (filename, n) s = StringIO(z.read(n)) try: dcm = dicomio.read_file(s) except: pass # ignore files which aren't Dicom files else: seriesid = dcm.get('SeriesInstanceUID', '???') if seriesid not in series: series[seriesid] = DicomSeries(seriesid, nfilename) try: # attempt to create the image matrix, store None if this doesn't work rslope = float(dcm.get('RescaleSlope', 1) or 1) rinter = float(dcm.get('RescaleIntercept', 0) or 0) img = dcm.pixel_array * rslope + rinter except: img = None s = series[seriesid] s.addFile(nfilename, dcm) s.tagcache[len(s.filenames) - 1] = dcm s.imgcache[len(s.filenames) - 1] = img count += 1 # update status only 100 times, doing it too frequently really slows things down if numfiles < 100 or count % (numfiles // 100) == 0: statusfunc('Loading DICOM files', count, numfiles) statusfunc('', 0, 0) return list(series.values())