dicom-microscopy-viewer
Version:
Interactive web-based viewer for DICOM Microscopy Images
155 lines (128 loc) • 7.05 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: webWorker/transformers/transformerICC.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: webWorker/transformers/transformerICC.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import dicomiccFactory from 'dicomicc/dist/dicomiccwasm.js'
import dicomiccWASM from 'dicomicc/dist/dicomiccwasm.wasm'
import Transformer from './transformerAbstract.js'
export default class ColorTransformer extends Transformer {
/**
* Construct transformer object.
*
* @param {Array<metadata.VLWholeSlideMicroscopyImage>} - Metadata of each
* image
* @param {Array<TypedArray>} - ICC profiles of each image
*/
constructor (metadata, iccProfiles) {
super()
if (metadata.length !== iccProfiles.length) {
throw new Error(
'Argument "metadata" and "iccProfiles" must have same length: ' +
`${metadata.length} versus ${iccProfiles.length}`
)
}
this.metadata = metadata
this.iccProfiles = iccProfiles
this.codec = null
this.transformers = {}
}
_initialize () {
if (this.codec) {
return Promise.resolve()
}
const dicomicc = dicomiccFactory({
locateFile: (f) => {
if (f.endsWith('.wasm')) {
return dicomiccWASM
}
return f
}
})
return new Promise((resolve, reject) => {
dicomicc.then((instance) => {
this.codec = instance
for (let index = 0; index < this.metadata.length; index++) {
const columns = this.metadata[index].Columns
const rows = this.metadata[index].Rows
const bitsPerSample = this.metadata[index].BitsAllocated
const samplesPerPixel = this.metadata[index].SamplesPerPixel
const planarConfiguration = this.metadata[index].PlanarConfiguration
const sopInstanceUID = this.metadata[index].SOPInstanceUID
const profile = this.iccProfiles[index]
this.transformers[sopInstanceUID] = new this.codec.ColorManager(
{
columns,
rows,
bitsPerSample,
samplesPerPixel,
planarConfiguration
},
profile
)
}
resolve(this.transformers)
}, reject)
})
}
/**
* Transform image.
*
* The transform is applied only is iccProfiles are available.
* Otherwise the function return the original decoded frame.
*
* @param {string} - SOP Instance UID of current image that should be transformed
* @param {Buffer} - decoded Frame
*
* @returns {Promise<Buffer>} transformed buffer
*/
async transform (sopInstanceUID, decodedFrame) {
if (this.codec == null) {
await this._initialize()
}
let transformedFrame
if (sopInstanceUID in this.transformers) {
const transformer = this.transformers[sopInstanceUID]
if (transformer) {
transformedFrame = transformer.transform(decodedFrame)
} else {
transformedFrame = new Promise(function (resolve) {
resolve(decodedFrame)
})
}
} else {
transformedFrame = new Promise(function (resolve) {
resolve(decodedFrame)
})
}
return transformedFrame
}
}
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Namespaces</h3><ul><li><a href="annotation.html">annotation</a></li><li><a href="api.html">api</a></li><li><a href="color.html">color</a></li><li><a href="events.html">events</a></li><li><a href="mapping.html">mapping</a></li><li><a href="metadata.html">metadata</a></li><li><a href="opticalPath.html">opticalPath</a></li><li><a href="roi.html">roi</a></li><li><a href="scoord3d.html">scoord3d</a></li><li><a href="segment.html">segment</a></li><li><a href="utils.html">utils</a></li><li><a href="viewer.html">viewer</a></li></ul><h3>Classes</h3><ul><li><a href="annotation.AnnotationGroup.html">AnnotationGroup</a></li><li><a href="color.PaletteColorLookupTable.html">PaletteColorLookupTable</a></li><li><a href="mapping.ParameterMapping.html">ParameterMapping</a></li><li><a href="mapping.Transformation.html">Transformation</a></li><li><a href="metadata.Comprehensive3DSR.html">Comprehensive3DSR</a></li><li><a href="metadata.MicroscopyBulkSimpleAnnotations.html">MicroscopyBulkSimpleAnnotations</a></li><li><a href="metadata.ParametricMap.html">ParametricMap</a></li><li><a href="metadata.Segmentation.html">Segmentation</a></li><li><a href="metadata.SOPClass.html">SOPClass</a></li><li><a href="metadata.VLWholeSlideMicroscopyImage.html">VLWholeSlideMicroscopyImage</a></li><li><a href="module.exports_module.exports.html">exports</a></li><li><a href="opticalPath.OpticalPath.html">OpticalPath</a></li><li><a href="roi.ROI.html">ROI</a></li><li><a href="scoord3d.Ellipse.html">Ellipse</a></li><li><a href="scoord3d.Ellipsoid.html">Ellipsoid</a></li><li><a href="scoord3d.Multipoint.html">Multipoint</a></li><li><a href="scoord3d.Point.html">Point</a></li><li><a href="scoord3d.Polygon.html">Polygon</a></li><li><a href="scoord3d.Polyline.html">Polyline</a></li><li><a href="scoord3d.Scoord3D.html">Scoord3D</a></li><li><a href="segment.Segment.html">Segment</a></li><li><a href="viewer.LabelImageViewer.html">LabelImageViewer</a></li><li><a href="viewer.OverviewImageViewer.html">OverviewImageViewer</a></li><li><a href="viewer.VolumeImageViewer.html">VolumeImageViewer</a></li></ul><h3>Global</h3><ul><li><a href="global.html#addTask">addTask</a></li><li><a href="global.html#cancelTask">cancelTask</a></li><li><a href="global.html#decode">decode</a></li><li><a href="global.html#getStatistics">getStatistics</a></li><li><a href="global.html#handleMessageFromWorker">handleMessageFromWorker</a></li><li><a href="global.html#initialize">initialize</a></li><li><a href="global.html#loadWebWorkerTask">loadWebWorkerTask</a></li><li><a href="global.html#setTaskPriority">setTaskPriority</a></li><li><a href="global.html#spawnWebWorker">spawnWebWorker</a></li><li><a href="global.html#startTaskOnWebWorker">startTaskOnWebWorker</a></li><li><a href="global.html#terminateAllWebWorkers">terminateAllWebWorkers</a></li><li><a href="global.html#transform">transform</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.10</a> on Thu Sep 29 2022 16:54:54 GMT-0400 (Eastern Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>