UNPKG

@cornerstonejs/dicom-image-loader

Version:

Cornerstone Image Loader for DICOM WADO-URI and WADO-RS and Local file

56 lines (55 loc) 2.22 kB
import * as dicomParser from 'dicom-parser'; function fixFragments(dataSet) { const fragments = dataSet.elements.x7fe00010.fragments; const totalLength = dataSet.byteArray.length; for (const fragment of fragments) { const { position, length } = fragment; if (length > totalLength - position) { console.log(`Truncated fragment, changing fragment length from ${fragment.length} to ${totalLength - position}`); fragment.length = totalLength - position; } } return dataSet; } function parsePartialByteArray(byteArray) { let dataSet = dicomParser.parseDicom(byteArray, { untilTag: 'x7fe00010', }); if (!dataSet.elements.x7fe00010) { console.warn('Pixel data not found!'); } let pixelDataSet; try { pixelDataSet = dicomParser.parseDicom(byteArray); } catch (err) { console.error(err); console.log('pixel data dataset:', err.dataSet); pixelDataSet = err.dataSet; } dataSet.elements.x7fe00010 = pixelDataSet.elements.x7fe00010; dataSet = fixFragments(dataSet); return dataSet; } export default async function dataSetFromPartialContent(byteArray, loadRequest, metadata) { const dataSet = parsePartialByteArray(byteArray); const { uri, imageId, fileTotalLength } = metadata; dataSet.fetchMore = async function (fetchOptions) { const _options = Object.assign({ uri, imageId, fetchedLength: byteArray.length, lengthToFetch: fileTotalLength - byteArray.length, }, fetchOptions); const { fetchedLength, lengthToFetch } = _options; const { arrayBuffer } = await loadRequest(uri, imageId, { byteRange: `${fetchedLength}-${fetchedLength + lengthToFetch}`, }); const byteArrayToAppend = new Uint8Array(arrayBuffer); const combinedByteArray = new Uint8Array(dataSet.byteArray.length + byteArrayToAppend.length); combinedByteArray.set(dataSet.byteArray); combinedByteArray.set(byteArrayToAppend, dataSet.byteArray.length); return dataSetFromPartialContent(combinedByteArray, loadRequest, metadata); }; return dataSet; }