Enhance DICOM 3D loader to fallback to 2D loader for standard web images and handle 'https' URLs
This commit is contained in:
@@ -602,16 +602,41 @@ async function setUpDicom3d(element) {
|
|||||||
// but avoid forcing wadouri: for standard web images (png/jpg/etc) because
|
// but avoid forcing wadouri: for standard web images (png/jpg/etc) because
|
||||||
// the dicom parser will fail when given non-DICOM files. For such images
|
// the dicom parser will fail when given non-DICOM files. For such images
|
||||||
// return the raw URL so the appropriate web-image loader can handle them.
|
// return the raw URL so the appropriate web-image loader can handle them.
|
||||||
|
// If any image looks like a plain web image (png/jpg/etc) prefer the
|
||||||
|
// existing 2D cornerstone loader which handles http(s) image schemes.
|
||||||
|
// This avoids a situation where the 3D dicom loader has no handler for
|
||||||
|
// the 'https' scheme and throws "No image loader found for scheme 'https'".
|
||||||
|
const looksLikeWebImage = (u) => {
|
||||||
|
if (!u) return false;
|
||||||
|
try { u = u.trim(); } catch (e) {}
|
||||||
|
if (u.startsWith('data:image')) return true;
|
||||||
|
if (u.match(/\.(png|jpe?g|gif|bmp|webp)$/i)) return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (images.some(looksLikeWebImage)) {
|
||||||
|
// Fallback: use the 2D cornerstone loader which has web-image handling
|
||||||
|
// and is more tolerant of raw http(s) URLs. We reuse the project's
|
||||||
|
// dicomViewer helper (it expects a jQuery element).
|
||||||
|
console.warn('setUpDicom3d: contains web-image(s) — falling back to 2D loader');
|
||||||
|
try {
|
||||||
|
// annotations are not available in this scope in the 3d code path; pass
|
||||||
|
// undefined for annotations and let the loader handle it.
|
||||||
|
dicomViewer.loadCornerstone($(element), null, images, undefined, images.length > 5);
|
||||||
|
// store a lightweight marker so callers can inspect what happened
|
||||||
|
element._cornerstone3d = { fallback: 'cornerstone2d', imageCount: images.length };
|
||||||
|
return element._cornerstone3d;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('Fallback 2D loader failed; will continue to try 3D loader', err);
|
||||||
|
// fallthrough to attempt 3D loading below
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const imageIds = images.map((url) => {
|
const imageIds = images.map((url) => {
|
||||||
url = url.trim();
|
url = url.trim();
|
||||||
// if it's already a scheme we pass through
|
// if it's already a scheme we pass through
|
||||||
if (/^(wadouri:|base64:|data:|http:|https:)/i.test(url)) return url;
|
if (/^(wadouri:|base64:|data:|http:|https:)/i.test(url)) return url;
|
||||||
|
|
||||||
// If the URL looks like a regular web image, don't treat it as DICOM
|
|
||||||
if (url.match(/\.(png|jpe?g|gif|bmp|webp)$/i)) {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
// default: treat as wadouri (likely a DICOM file)
|
// default: treat as wadouri (likely a DICOM file)
|
||||||
return `wadouri:${url}`;
|
return `wadouri:${url}`;
|
||||||
});
|
});
|
||||||
@@ -629,7 +654,21 @@ async function setUpDicom3d(element) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
await viewport.setStack(imageIds, 0);
|
await viewport.setStack(imageIds, 0);
|
||||||
|
} catch (err) {
|
||||||
|
// If the 3D loader fails because it doesn't know how to load 'https'
|
||||||
|
// URLs, fallback to the 2D cornerstone loader which handles web images.
|
||||||
|
console.warn('viewport.setStack failed, attempting 2D fallback:', err);
|
||||||
|
try {
|
||||||
|
dicomViewer.loadCornerstone($(element), null, images, undefined, images.length > 5);
|
||||||
|
element._cornerstone3d = { fallback: 'cornerstone2d', imageCount: images.length };
|
||||||
|
return element._cornerstone3d;
|
||||||
|
} catch (err2) {
|
||||||
|
console.error('2D fallback also failed:', err2);
|
||||||
|
throw err; // rethrow original error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
viewport.render();
|
viewport.render();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user