@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
JavaScript
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;
}