Skip to content

Commit

Permalink
* fixed bug in readEncapsulatedImageFrame() where optional fragments …
Browse files Browse the repository at this point in the history
…parameter was ignored

* enhanced DICOM Dump with Data Dictionary example
  * allows downloading of encapsulated image frames and binary data
  * allows downloading of raw binary data
  * added checkbox for showing and calculating SHA1
  * the parsed dataSet is now in global scope to aid in debugging from the browser console
  * the parsed dataSet is now dumped to console to aid in debugging form the browser console
  • Loading branch information
chafey committed Jun 9, 2016
1 parent 033c111 commit 5b50dd9
Show file tree
Hide file tree
Showing 9 changed files with 196 additions and 78 deletions.
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dicomParser",
"version": "1.7.0",
"version": "1.7.1",
"description": "Javascript parser for DICOM Part 10 data",
"main": "dist/dicomParser.js",
"ignore": [
Expand Down
49 changes: 27 additions & 22 deletions dist/dicomParser.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/*! dicom-parser - v1.7.0 - 2016-06-06 | (c) 2014 Chris Hafey | https://github.com/chafey/dicomParser */
/*! dicom-parser - v1.7.1 - 2016-06-09 | (c) 2014 Chris Hafey | https://github.com/chafey/dicomParser */
(function (root, factory) {

// node.js
Expand Down Expand Up @@ -2003,20 +2003,21 @@ var dicomParser = (function (dicomParser)
}
}

function calculateNumberOfFragments(dataSet, pixelDataElement, frame, basicOffsetTable, fragments, startFragment) {
function calculateNumberOfFragmentsForFrame(frameIndex, basicOffsetTable, fragments, startFragmentIndex) {
// special case for last frame
if(frame === basicOffsetTable.length -1) {
return fragments.length - startFragment;
if(frameIndex === basicOffsetTable.length -1) {
return fragments.length - startFragmentIndex;
}

// iterate through each fragment looking for the one matching the offset for the next frame
var nextFrameOffset = basicOffsetTable[frame + 1];
for(var i=startFragment + 1; i < fragments.length; i++) {
var nextFrameOffset = basicOffsetTable[frameIndex + 1];
for(var i=startFragmentIndex + 1; i < fragments.length; i++) {
if(fragments[i].offset === nextFrameOffset) {
return i - startFragment;
return i - startFragmentIndex;
}
}
throw "dicomParser.calculateNumberOfFragments: could not find fragment with offset matching basic offset table";

throw "dicomParser.calculateNumberOfFragmentsForFrame: could not find fragment with offset matching basic offset table";
}

/**
Expand All @@ -2028,16 +2029,16 @@ var dicomParser = (function (dicomParser)
*
* @param dataSet - the dataSet containing the encapsulated pixel data
* @param pixelDataElement - the pixel data element (x7fe00010) to extract the frame from
* @param frame - the zero based frame index
* @param frameIndex - the zero based frame index
* @param [basicOffsetTable] - optional array of starting offsets for frames
* @param [fragments] - optional array of objects describing each fragment (offset, position, length)
* @returns {object} with the encapsulated pixel data
*/
dicomParser.readEncapsulatedImageFrame = function(dataSet, pixelDataElement, frame, basicOffsetTable, fragments)
dicomParser.readEncapsulatedImageFrame = function(dataSet, pixelDataElement, frameIndex, basicOffsetTable, fragments)
{
// default parameters
basicOffsetTable = basicOffsetTable || pixelDataElement.basicOffsetTable;
fragments = pixelDataElement.fragments;
fragments = fragments || pixelDataElement.fragments;

// Validate parameters
if(dataSet === undefined) {
Expand All @@ -2046,8 +2047,8 @@ var dicomParser = (function (dicomParser)
if(pixelDataElement === undefined) {
throw "dicomParser.readEncapsulatedImageFrame: missing required parameter 'pixelDataElement'";
}
if(frame === undefined) {
throw "dicomParser.readEncapsulatedImageFrame: missing required parameter 'frame'";
if(frameIndex === undefined) {
throw "dicomParser.readEncapsulatedImageFrame: missing required parameter 'frameIndex'";
}
if(basicOffsetTable === undefined) {
throw "dicomParser.readEncapsulatedImageFrame: parameter 'pixelDataElement' does not have basicOffsetTable";
Expand All @@ -2067,20 +2068,24 @@ var dicomParser = (function (dicomParser)
if(basicOffsetTable.length === 0) {
throw "dicomParser.readEncapsulatedImageFrame: basicOffsetTable has zero entries";
}
if(frame < 0) {
throw "dicomParser.readEncapsulatedImageFrame: parameter 'frame' must be >= 0";
if(frameIndex < 0) {
throw "dicomParser.readEncapsulatedImageFrame: parameter 'frameIndex' must be >= 0";
}
if(frame >= basicOffsetTable.length) {
throw "dicomParser.readEncapsulatedImageFrame: parameter 'frame' must be < basicOffsetTable.length";
if(frameIndex >= basicOffsetTable.length) {
throw "dicomParser.readEncapsulatedImageFrame: parameter 'frameIndex' must be < basicOffsetTable.length";
}

// find starting fragment based on basicOffsetTable
var startingOffset = basicOffsetTable[frame];
var startFragmentIndex = findFragmentIndexWithOffset(fragments, startingOffset);
// find starting fragment based on the offset for the frame in the basic offset table
var offset = basicOffsetTable[frameIndex];
var startFragmentIndex = findFragmentIndexWithOffset(fragments, offset);
if(startFragmentIndex === undefined) {
throw "dicomParser.readEncapsulatedImageFrame: unable to find fragment that matches basic offset table entry";
}
var numFragments = calculateNumberOfFragments(dataSet, pixelDataElement, frame, basicOffsetTable, fragments, startFragmentIndex);

// calculate the number of fragments for this frame
var numFragments = calculateNumberOfFragmentsForFrame(frameIndex, basicOffsetTable, fragments, startFragmentIndex);

// now extract the frame from the fragments
return dicomParser.readEncapsulatedPixelDataFromFragments(dataSet, pixelDataElement, startFragmentIndex, numFragments, fragments);
};

Expand Down Expand Up @@ -2628,7 +2633,7 @@ var dicomParser = (function (dicomParser)
dicomParser = {};
}

dicomParser.version = "1.7.0";
dicomParser.version = "1.7.1";

return dicomParser;
}(dicomParser));
Expand Down
4 changes: 2 additions & 2 deletions dist/dicomParser.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/package.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package.describe({
name: 'chafey:dicom-parser',
summary: 'Javascript parser for DICOM Part 10 data',
version: '1.7.0',
version: '1.7.1',
git: 'https://github.com/chafey/dicomParser.git/',
documentation: null
});
Expand Down
Loading

0 comments on commit 5b50dd9

Please sign in to comment.