Skip to content

Commit 89a62a4

Browse files
317: Updates (#338)
* Disable seg interpolation by default * Use thumbnail if no overview images for thumbnails * Address deep source issue * Lint * Bump dmv version
1 parent c6f544a commit 89a62a4

7 files changed

Lines changed: 52 additions & 14 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"craco-less": "^2.0.0",
5757
"dcmjs": "^0.35.0",
5858
"detect-browser": "^5.2.1",
59-
"dicom-microscopy-viewer": "^0.48.9",
59+
"dicom-microscopy-viewer": "^0.48.10",
6060
"dicomweb-client": "^0.10.3",
6161
"gh-pages": "^5.0.0",
6262
"oidc-client": "^1.11.5",

src/App.dark.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ img {
3232
object-fit: contain;
3333
max-height: 100%;
3434
}
35+

src/App.light.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ img {
3232
object-fit: contain;
3333
max-height: 100%;
3434
}
35+

src/components/SlideItem.tsx

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,31 @@ class SlideItem extends React.Component<SlideItemProps, SlideItemState> {
4444

4545
componentDidMount (): void {
4646
this.setState({ isLoading: true })
47-
if (this.props.slide.overviewImages.length > 0) {
48-
const metadata = this.props.slide.overviewImages[0]
47+
48+
/* Use OVERVIEW if available, otherwise fall back to THUMBNAIL */
49+
const previewImages = this.props.slide.overviewImages.length > 0
50+
? this.props.slide.overviewImages
51+
: this.props.slide.thumbnailImages
52+
53+
if (previewImages.length > 0) {
54+
const metadata = previewImages[0]
4955
if (this.overviewViewportRef.current !== null && this.overviewViewportRef.current !== undefined) {
5056
this.overviewViewportRef.current.innerHTML = ''
57+
const imageType = this.props.slide.overviewImages.length > 0 ? 'OVERVIEW' : 'THUMBNAIL'
5158
console.info(
52-
'instantiate viewer for OVERVIEW image of slide ' +
59+
`instantiate viewer for ${imageType} image of slide ` +
5360
`"${metadata.ContainerIdentifier}"`
5461
)
62+
// For thumbnails, use a much smaller resizeFactor to ensure the entire image fits
63+
const resizeFactor = imageType === 'THUMBNAIL' ? 0.3 : 1
64+
5565
this.overviewViewer = new dmv.viewer.OverviewImageViewer({
5666
client: this.props.clients[
5767
StorageClasses.VL_WHOLE_SLIDE_MICROSCOPY_IMAGE
5868
],
5969
disableInteractions: true,
6070
metadata,
61-
resizeFactor: 1,
71+
resizeFactor,
6272
errorInterceptor: (error: CustomError) => {
6373
NotificationMiddleware.onError(
6474
NotificationMiddlewareContext.DMV,
@@ -69,6 +79,16 @@ class SlideItem extends React.Component<SlideItemProps, SlideItemState> {
6979
this.overviewViewer.render({
7080
container: this.overviewViewportRef.current
7181
})
82+
83+
// For thumbnail images, ensure proper fitting after render
84+
if (imageType === 'THUMBNAIL') {
85+
setTimeout(() => {
86+
if (this.overviewViewer !== undefined) {
87+
// Force resize to ensure proper fitting
88+
this.overviewViewer.resize()
89+
}
90+
}, 100)
91+
}
7292
}
7393
}
7494

@@ -108,9 +128,12 @@ class SlideItem extends React.Component<SlideItemProps, SlideItemState> {
108128
selectable
109129
>
110130
<div style={{ position: 'relative', height: '100px' }}>
111-
{this.props.slide.overviewImages.length > 0
131+
{(this.props.slide.overviewImages.length > 0 || this.props.slide.thumbnailImages.length > 0)
112132
? (
113-
<div ref={this.overviewViewportRef} style={{ height: '100%' }} />
133+
<div
134+
ref={this.overviewViewportRef}
135+
style={{ height: '100%' }}
136+
/>
114137
)
115138
: (
116139
<div style={{

src/components/SlideViewer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ class SlideViewer extends React.Component<SlideViewerProps, SlideViewerState> {
250250
selectedPresentationStateUID: this.props.selectedPresentationStateUID,
251251
loadingFrames: new Set(),
252252
isICCProfilesEnabled: true,
253-
isSegmentationInterpolationEnabled: true,
253+
isSegmentationInterpolationEnabled: false,
254254
customizedSegmentColors: {}
255255
}
256256
}

src/data/slides.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ interface SlideImageCollection {
3636
volumeImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
3737
labelImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
3838
overviewImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
39+
thumbnailImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
3940
}
4041

4142
interface SlideOptions {
@@ -59,6 +60,7 @@ class Slide {
5960
readonly volumeImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
6061
readonly labelImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
6162
readonly overviewImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
63+
readonly thumbnailImages: dmv.metadata.VLWholeSlideMicroscopyImage[]
6264

6365
/**
6466
* @param options
@@ -95,6 +97,7 @@ class Slide {
9597
const volumeImages: dmv.metadata.VLWholeSlideMicroscopyImage[] = []
9698
const labelImages: dmv.metadata.VLWholeSlideMicroscopyImage[] = []
9799
const overviewImages: dmv.metadata.VLWholeSlideMicroscopyImage[] = []
100+
const thumbnailImages: dmv.metadata.VLWholeSlideMicroscopyImage[] = []
98101
options.images.forEach((image) => {
99102
containerIdentifiers.add(image.ContainerIdentifier)
100103
seriesInstanceUIDs.add(image.SeriesInstanceUID)
@@ -105,6 +108,9 @@ class Slide {
105108
acquisitionUIDs.add(image.AcquisitionUID)
106109
}
107110
if (hasImageFlavor(image, ImageFlavors.VOLUME) || hasImageFlavor(image, ImageFlavors.THUMBNAIL)) {
111+
if (hasImageFlavor(image, ImageFlavors.THUMBNAIL)) {
112+
thumbnailImages.push(image)
113+
}
108114
frameOfReferenceUIDs.VOLUME.add(image.FrameOfReferenceUID)
109115
if (image.PyramidUID !== null && image.PyramidUID !== undefined) {
110116
for (const identifier of Object.keys(opticalPathIdentifiers)) {
@@ -170,6 +176,7 @@ class Slide {
170176
this.volumeImages = volumeImages
171177
this.labelImages = labelImages
172178
this.overviewImages = overviewImages
179+
this.thumbnailImages = thumbnailImages
173180

174181
this.seriesInstanceUIDs = [...seriesInstanceUIDs]
175182
this.opticalPathIdentifiers = [...opticalPathIdentifiers]
@@ -284,6 +291,9 @@ const createSlides = (
284291
hasImageFlavor(image, ImageFlavors.VOLUME) ||
285292
hasImageFlavor(image, ImageFlavors.THUMBNAIL)
286293
)
294+
const thumbnailImages = series.filter(
295+
(image) => hasImageFlavor(image, ImageFlavors.THUMBNAIL)
296+
)
287297
if (volumeImages.length > 0) {
288298
const refImage = volumeImages[0]
289299
const filteredVolumeImages = volumeImages.filter((image) => {
@@ -323,14 +333,16 @@ const createSlides = (
323333
containerIdentifier: refImage.ContainerIdentifier,
324334
volumeImages: filteredVolumeImages,
325335
labelImages: filteredLabelImages,
326-
overviewImages: filteredOverviewImages
336+
overviewImages: filteredOverviewImages,
337+
thumbnailImages
327338
}
328339
slideMetadata.push(slideMetadataItem)
329340
} else {
330341
const slideMetadataItem = slideMetadata[slideMetadataIndex]
331342
slideMetadataItem.volumeImages.push(...filteredVolumeImages)
332343
slideMetadataItem.labelImages.push(...filteredLabelImages)
333344
slideMetadataItem.overviewImages.push(...filteredOverviewImages)
345+
slideMetadataItem.thumbnailImages.push(...thumbnailImages)
334346
}
335347
}
336348
}
@@ -341,7 +353,8 @@ const createSlides = (
341353
images: [
342354
...item.volumeImages,
343355
...item.labelImages,
344-
...item.overviewImages
356+
...item.overviewImages,
357+
...item.thumbnailImages
345358
]
346359
})
347360
})

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4990,10 +4990,10 @@ detective@^5.2.1:
49904990
defined "^1.0.0"
49914991
minimist "^1.2.6"
49924992

4993-
dicom-microscopy-viewer@^0.48.9:
4994-
version "0.48.9"
4995-
resolved "https://registry.yarnpkg.com/dicom-microscopy-viewer/-/dicom-microscopy-viewer-0.48.9.tgz#90d190190fd10d450f0195d0d4800f54a5b423f7"
4996-
integrity sha512-q3b8cGbwNKcCWQhMcUDd9/gCXpYSkR8IXbm/S1T52qMJXYUogZWkYZ2E9wpik4CGJxTcYF525OQOeJFuROdeVA==
4993+
dicom-microscopy-viewer@^0.48.10:
4994+
version "0.48.10"
4995+
resolved "https://registry.yarnpkg.com/dicom-microscopy-viewer/-/dicom-microscopy-viewer-0.48.10.tgz#980bacef047d2b14ee15b9c5fc2a88107fc3df71"
4996+
integrity sha512-2mgtK2WMUUmAFPiJVXYPf76A4dWrumiV0nT4peE1MaV81iVe4cWUf1GLGdCizL7NnzhyLicmV8bXz846djRFJA==
49974997
dependencies:
49984998
"@cornerstonejs/codec-charls" "^1.2.3"
49994999
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"

0 commit comments

Comments
 (0)