Skip to content

Commit 4b1034e

Browse files
committed
feat(formats): Add MGH support
1 parent b249a38 commit 4b1034e

11 files changed

Lines changed: 152 additions & 3 deletions

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ set(BridgeJavaScript_IOModules
1616
"ITKIOHDF5"
1717
"ITKIOMINC"
1818
"ITKIOLSM"
19+
"MGHIO"
1920
"ITKIOBioRad"
2021
"ITKIOGIPL"
2122
"ITKIOGE"
@@ -30,6 +31,7 @@ set(imageios_ITKIOPNG itkPNGImageIO)
3031
set(imageios_ITKIOLSM itkLSMImageIO)
3132
set(imageios_ITKIOMeta itkMetaImageIO)
3233
set(imageios_ITKIOMINC itkMINCImageIO)
34+
set(imageios_MGHIO itkMGHImageIO)
3335
set(imageios_ITKIONIFTI itkNiftiImageIO)
3436
set(imageios_ITKIONRRD itkNrrdImageIO)
3537
set(imageios_ITKIOGDCM itkGDCMImageIO)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Supported file formats
2020
- [LSM](http://www.openwetware.org/wiki/Dissecting_LSM_files)
2121
- [MetaImage](https://itk.org/Wiki/ITK/MetaIO/Documentation)
2222
- [MINC 2.0](https://en.wikibooks.org/wiki/MINC/SoftwareDevelopment/MINC2.0_File_Format_Reference)
23+
- [MGH](https://surfer.nmr.mgh.harvard.edu/fswiki/FsTutorial/MghFormat)
2324
- [NifTi](https://nifti.nimh.nih.gov/nifti-1)
2425
- [NRRD](http://teem.sourceforge.net/nrrd/format.html)
2526
- [Portable Network Graphics (PNG)](https://en.wikipedia.org/wiki/Portable_Network_Graphics)

src/extensionToIO.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ extensionToIO['MNC.GZ'] = 'itkMINCImageIOJSBinding'
2525
extensionToIO['mnc2'] = 'itkMINCImageIOJSBinding'
2626
extensionToIO['MNC2'] = 'itkMINCImageIOJSBinding'
2727

28+
extensionToIO['mgh'] = 'itkMGHImageIOJSBinding'
29+
extensionToIO['mgz'] = 'itkMGHImageIOJSBinding'
30+
extensionToIO['mgh.gz'] = 'itkMGHImageIOJSBinding'
31+
2832
extensionToIO['mha'] = 'itkMetaImageIOJSBinding'
2933
extensionToIO['mhd'] = 'itkMetaImageIOJSBinding'
3034

src/itkMGHImageIOJSBinding.cxx

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*=========================================================================
2+
*
3+
* Copyright Insight Software Consortium
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0.txt
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*=========================================================================*/
18+
19+
#include <emscripten.h>
20+
#include <emscripten/bind.h>
21+
22+
#include "itkMGHImageIO.h"
23+
24+
#include "itkImageIOBaseJSBinding.h"
25+
26+
typedef itk::ImageIOBaseJSBinding< itk::MGHImageIO > MGHImageIOJSBindingType;
27+
28+
EMSCRIPTEN_BINDINGS(itk_mgh_image_io_js_binding) {
29+
emscripten::register_vector<double>("AxisDirectionType");
30+
emscripten::enum_<MGHImageIOJSBindingType::IOPixelType>("IOPixelType")
31+
.value("UNKNOWNPIXELTYPE", itk::ImageIOBase::UNKNOWNPIXELTYPE)
32+
.value("SCALAR", itk::ImageIOBase::SCALAR)
33+
.value("RGB", itk::ImageIOBase::RGB)
34+
.value("RGBA", itk::ImageIOBase::RGBA)
35+
.value("OFFSET", itk::ImageIOBase::OFFSET)
36+
.value("VECTOR", itk::ImageIOBase::VECTOR)
37+
.value("POINT", itk::ImageIOBase::POINT)
38+
.value("COVARIANTVECTOR", itk::ImageIOBase::COVARIANTVECTOR)
39+
.value("SYMMETRICSECONDRANKTENSOR", itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR)
40+
.value("POINT", itk::ImageIOBase::POINT)
41+
.value("COVARIANTVECTOR", itk::ImageIOBase::COVARIANTVECTOR)
42+
.value("SYMMETRICSECONDRANKTENSOR", itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR)
43+
.value("DIFFUSIONTENSOR3D", itk::ImageIOBase::DIFFUSIONTENSOR3D)
44+
.value("COMPLEX", itk::ImageIOBase::COMPLEX)
45+
.value("FIXEDARRAY", itk::ImageIOBase::FIXEDARRAY)
46+
.value("MATRIX", itk::ImageIOBase::MATRIX)
47+
;
48+
emscripten::enum_<MGHImageIOJSBindingType::IOComponentType>("IOComponentType")
49+
.value("UNKNOWNCOMPONENTTYPE", itk::ImageIOBase::UNKNOWNCOMPONENTTYPE)
50+
.value("UCHAR", itk::ImageIOBase::UCHAR)
51+
.value("CHAR", itk::ImageIOBase::CHAR)
52+
.value("USHORT", itk::ImageIOBase::USHORT)
53+
.value("SHORT", itk::ImageIOBase::SHORT)
54+
.value("UINT", itk::ImageIOBase::UINT)
55+
.value("INT", itk::ImageIOBase::INT)
56+
.value("ULONG", itk::ImageIOBase::ULONG)
57+
.value("LONG", itk::ImageIOBase::LONG)
58+
.value("FLOAT", itk::ImageIOBase::FLOAT)
59+
.value("DOUBLE", itk::ImageIOBase::DOUBLE)
60+
;
61+
emscripten::class_<MGHImageIOJSBindingType>("ITKImageIO")
62+
.constructor<>()
63+
.function("SetNumberOfDimensions", &MGHImageIOJSBindingType::SetNumberOfDimensions)
64+
.function("GetNumberOfDimensions", &MGHImageIOJSBindingType::GetNumberOfDimensions)
65+
.function("SetFileName", &MGHImageIOJSBindingType::SetFileName)
66+
.function("GetFileName", &MGHImageIOJSBindingType::GetFileName)
67+
.function("CanReadFile", &MGHImageIOJSBindingType::CanReadFile)
68+
.function("ReadImageInformation", &MGHImageIOJSBindingType::ReadImageInformation)
69+
.function("SetDimensions", &MGHImageIOJSBindingType::SetDimensions)
70+
.function("GetDimensions", &MGHImageIOJSBindingType::GetDimensions)
71+
.function("SetOrigin", &MGHImageIOJSBindingType::SetOrigin)
72+
.function("GetOrigin", &MGHImageIOJSBindingType::GetOrigin)
73+
.function("SetSpacing", &MGHImageIOJSBindingType::SetSpacing)
74+
.function("GetSpacing", &MGHImageIOJSBindingType::GetSpacing)
75+
.function("SetDirection", &MGHImageIOJSBindingType::SetDirection)
76+
.function("GetDirection", &MGHImageIOJSBindingType::GetDirection)
77+
.function("GetDefaultDirection", &MGHImageIOJSBindingType::GetDefaultDirection)
78+
.function("SetPixelType", &MGHImageIOJSBindingType::SetPixelType)
79+
.function("GetPixelType", &MGHImageIOJSBindingType::GetPixelType)
80+
.function("SetComponentType", &MGHImageIOJSBindingType::SetComponentType)
81+
.function("GetComponentType", &MGHImageIOJSBindingType::GetComponentType)
82+
.class_function("GetPixelTypeAsString", &MGHImageIOJSBindingType::GetPixelTypeAsString)
83+
.class_function("GetComponentTypeAsString", &MGHImageIOJSBindingType::GetComponentTypeAsString)
84+
.function("GetImageSizeInPixels", &MGHImageIOJSBindingType::GetImageSizeInPixels)
85+
.function("GetImageSizeInBytes", &MGHImageIOJSBindingType::GetImageSizeInBytes)
86+
.function("GetImageSizeInComponents", &MGHImageIOJSBindingType::GetImageSizeInComponents)
87+
.function("SetNumberOfComponents", &MGHImageIOJSBindingType::SetNumberOfComponents)
88+
.function("GetNumberOfComponents", &MGHImageIOJSBindingType::GetNumberOfComponents)
89+
.function("Read", &MGHImageIOJSBindingType::Read)
90+
;
91+
}

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ ExternalData_Expand_Arguments(
3636
DATA{Input/ITKImage.hdf5}
3737
DATA{Input/cthead1.lsm}
3838
DATA{Input/t1_z+_short_cor.mnc}
39+
DATA{Input/T1.mgz}
3940
)

test/Docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ RUN git clone https://github.com/InsightSoftwareConsortium/ITK.git && \
2424
-DITK_BUILD_DEFAULT_MODULES:BOOL=OFF \
2525
-DITKGroup_IO:BOOL=ON \
2626
-DModule_ITKIOMINC:BOOL=ON \
27-
-DModule_ITKIOMGH:BOOL=ON \
27+
-DModule_MGHIO:BOOL=ON \
2828
-DModule_ITKImageFunction:BOOL=ON \
2929
../ITK && \
3030
ninja -j7 && \

test/GETest.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,3 @@ test('Test reading a GEAdw file', t => {
9494
t.is(image.buffer[10], 80, 'buffer[10]')
9595
})
9696
})
97-

test/Input/T1.mgz.md5

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0409fb9d011d00b8a0d8f18997634017

test/MGHTest.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import test from 'ava'
2+
import path from 'path'
3+
4+
const IntTypes = require(path.resolve(__dirname, '..', 'dist', 'IntTypes.js'))
5+
const PixelTypes = require(path.resolve(__dirname, '..', 'dist', 'PixelTypes.js'))
6+
const readImageLocalFile = require(path.resolve(__dirname, '..', 'dist', 'readImageLocalFile.js'))
7+
8+
test('Test reading a MGH file', t => {
9+
const testFilePath = path.resolve(__dirname, '..', 'build', 'ExternalData', 'test', 'Input', 'T1.mgz')
10+
return readImageLocalFile(testFilePath).then(function (image) {
11+
t.is(image.imageType.dimension, 3, 'dimension')
12+
t.is(image.imageType.componentType, IntTypes.UInt8, 'componentType')
13+
t.is(image.imageType.pixelType, PixelTypes.Scalar, 'pixelType')
14+
t.is(image.imageType.components, 1, 'components')
15+
t.is(image.origin[0], -127.16149944067001, 'origin[0]')
16+
t.is(image.origin[1], 148.39564514160156, 'origin[1]')
17+
t.is(image.origin[2], 139.0726842880249, 'origin[2]')
18+
t.is(image.spacing[0], 1.0, 'spacing[0]')
19+
t.is(image.spacing[1], 1.0, 'spacing[1]')
20+
t.is(image.spacing[2], 1.0, 'spacing[2]')
21+
t.is(image.direction.getElement(0, 0), 1.0, 'direction (0, 0)')
22+
t.is(image.direction.getElement(0, 1), 0.0, 'direction (0, 1)')
23+
t.is(image.direction.getElement(0, 2), 0.0, 'direction (0, 2)')
24+
t.is(image.direction.getElement(1, 0), 0.0, 'direction (1, 0)')
25+
t.is(image.direction.getElement(1, 1), 0.0, 'direction (1, 1)')
26+
t.is(image.direction.getElement(1, 2), -1.0, 'direction (1, 2)')
27+
t.is(image.direction.getElement(2, 0), 0.0, 'direction (2, 0)')
28+
t.is(image.direction.getElement(2, 1), -1.0, 'direction (2, 1)')
29+
t.is(image.direction.getElement(2, 2), 0.0, 'direction (2, 2)')
30+
t.is(image.size[0], 256, 'size[0]')
31+
t.is(image.size[1], 256, 'size[1]')
32+
t.is(image.size[2], 256, 'size[2]')
33+
t.is(image.buffer.length, 16777216, 'buffer.length')
34+
t.is(image.buffer[1000], 0, 'buffer[1000]')
35+
})
36+
})

test/PNGTest.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,3 @@ test('Test reading a PNG file', t => {
2525
t.is(image.buffer.length, 196608, 'buffer.length')
2626
})
2727
})
28-

0 commit comments

Comments
 (0)