Skip to content

Commit 9d4d419

Browse files
committed
feat(formats): Add GE4, GE5, GEAdw support
Also uses the ImageIO::CanReadFile to detect the format.
1 parent 6c706a3 commit 9d4d419

21 files changed

Lines changed: 475 additions & 31 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*.ps
1010
*.toc
1111
build
12+
src/ImageIOIndex.js
1213
dist
1314
node_modules
1415
.DS_Store

CMakeLists.txt

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
11
cmake_minimum_required(VERSION 2.8.9)
22
project(BridgeJavaScript)
33

4+
# This list should be ordered from approximately most commonly to least
5+
# commonly used modules.
46
set(BridgeJavaScript_IOModules
5-
"ITKIOBioRad"
6-
"ITKIOBMP"
7-
"ITKIOGDCM"
8-
"ITKIOJPEG"
7+
"ITKIOPNG"
98
"ITKIOMeta"
9+
"ITKIOGDCM"
10+
"ITKIOTIFF"
1011
"ITKIONIFTI"
12+
"ITKIOJPEG"
1113
"ITKIONRRD"
12-
"ITKIOPNG"
13-
"ITKIOTIFF"
1414
"ITKIOVTK"
15+
"ITKIOBMP"
16+
"ITKIOBioRad"
17+
"ITKIOGE"
1518
CACHE STRING
1619
"String delimited list of ITK IO modules to support.")
17-
set(imageio_ITKIOBioRad itkBioRadImageIO)
18-
set(imageio_ITKIOBMP itkBMPImageIO)
19-
set(imageio_ITKIOPNG itkPNGImageIO)
20-
set(imageio_ITKIOMeta itkMetaImageIO)
21-
set(imageio_ITKIONIFTI itkNiftiImageIO)
22-
set(imageio_ITKIONRRD itkNrrdImageIO)
23-
set(imageio_ITKIOGDCM itkGDCMImageIO)
24-
set(imageio_ITKIOJPEG itkJPEGImageIO)
25-
set(imageio_ITKIOTIFF itkTIFFImageIO)
26-
set(imageio_ITKIOVTK itkVTKImageIO)
20+
set(imageios_ITKIOBioRad itkBioRadImageIO)
21+
set(imageios_ITKIOBMP itkBMPImageIO)
22+
set(imageios_ITKIOGE itkGEAdwImageIO itkGE4ImageIO itkGE5ImageIO)
23+
set(imageios_ITKIOPNG itkPNGImageIO)
24+
set(imageios_ITKIOMeta itkMetaImageIO)
25+
set(imageios_ITKIONIFTI itkNiftiImageIO)
26+
set(imageios_ITKIONRRD itkNrrdImageIO)
27+
set(imageios_ITKIOGDCM itkGDCMImageIO)
28+
set(imageios_ITKIOJPEG itkJPEGImageIO)
29+
set(imageios_ITKIOTIFF itkTIFFImageIO)
30+
set(imageios_ITKIOVTK itkVTKImageIO)
2731

2832

2933
if(NOT ITK_SOURCE_DIR)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Provides general scientific image IO capability and bridges
1212
- [BMP](https://en.wikipedia.org/wiki/BMP_file_format)
1313
- [DICOM](http://dicom.nema.org/)
1414
- [JPEG](https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format)
15+
- [GE4,GE5,GEAdw](http://www3.gehealthcare.com)
1516
- [MetaImage](https://itk.org/Wiki/ITK/MetaIO/Documentation)
1617
- [NifTi](https://nifti.nimh.nih.gov/nifti-1)
1718
- [NRRD](http://teem.sourceforge.net/nrrd/format.html)

build.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ try {
1919
} catch(err) {
2020
if (err.code == 'ENOENT') {
2121
const output = fs.openSync(dockcross, 'w')
22-
dockerCall = spawnSync('docker', ['run', '--rm', 'insighttoolkit/bridgejavascript-test'], {
22+
dockerCall = spawnSync('docker', ['run', '--rm', 'insighttoolkit/bridgejavascript'], {
2323
env: process.env,
2424
stdio: [ 'ignore', output, null ]
2525
})

circle.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ dependencies:
1313
override:
1414
- docker info
1515
- if [[ -e ~/docker/image.tar ]]; then docker load -i ~/docker/image.tar; fi
16-
- docker pull insighttoolkit/bridgejavascript-test:latest
16+
- docker pull insighttoolkit/bridgejavascript:latest
1717
- npm install
18-
- mkdir -p ~/docker; docker save insighttoolkit/bridgejavascript-test > ~/docker/image.tar
18+
- mkdir -p ~/docker; docker save insighttoolkit/bridgejavascript > ~/docker/image.tar
1919
- firefox --version
2020

2121
test:
@@ -44,7 +44,7 @@ deployment:
4444
branch: master
4545
commands:
4646
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
47-
- docker push insighttoolkit/bridgejavascript-test:latest
47+
- docker push insighttoolkit/bridgejavascript:latest
4848

4949
general:
5050
branches:

src/CMakeLists.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
set(ImageIOIndex_ARRAY "")
12
foreach(io_module ${BridgeJavaScript_IOModules})
23
find_package(ITK REQUIRED COMPONENTS ${io_module})
34
include(${ITK_USE_FILE})
45

5-
if(NOT DEFINED imageio_${io_module})
6+
if(NOT DEFINED imageios_${io_module})
67
message(FATAL_ERROR "Unknown ImageIOBase classes for module ${io_module}")
78
endif()
8-
foreach(imageio ${imageio_${io_module}})
9+
foreach(imageio ${imageios_${io_module}})
10+
set(ImageIOIndex_ARRAY "${ImageIOIndex_ARRAY}'${imageio}JSBinding', ")
911
set(target ${imageio}JSBinding)
1012
add_executable(${target} ${target}.cxx)
1113
itk_module_target_label(${target})
@@ -29,3 +31,6 @@ foreach(io_module ${BridgeJavaScript_IOModules})
2931
target_link_libraries(${target} LINK_PUBLIC ${ITK_LIBRARIES})
3032
endforeach()
3133
endforeach()
34+
35+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ImageIOIndex.js.in
36+
${CMAKE_CURRENT_SOURCE_DIR}/ImageIOIndex.js @ONLY)

src/ImageIOIndex.js.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const ImageIOIndex = [@ImageIOIndex_ARRAY@]
2+
3+
module.exports = ImageIOIndex

src/WebWorkers/ImageIOWorker.js

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const Image = require('../Image.js')
66
const mimeToIO = require('../MimeToIO.js')
77
const getFileExtension = require('../getFileExtension.js')
88
const extensionToIO = require('../extensionToIO.js')
9+
const ImageIOIndex = require('../ImageIOIndex.js')
10+
911
const readImageEmscriptenFSFile = require('../readImageEmscriptenFSFile.js')
1012

1113
// To cache loaded io modules
@@ -27,8 +29,32 @@ registerPromiseWorker(function (input, withTransferList) {
2729
} else if (extensionToIO.hasOwnProperty(extension)) {
2830
io = extensionToIO[extension]
2931
} else {
30-
// todo: Iterate through available IO's and have them run
31-
// .CanReadFile(filePath)
32+
for (let idx = 0; idx < ImageIOIndex.length; ++idx) {
33+
let ioModule = null
34+
const trialIO = ImageIOIndex[idx]
35+
if (trialIO in ioToModule) {
36+
ioModule = ioToModule[trialIO]
37+
} else {
38+
const modulePath = input.config.imageIOsPath + '/' + trialIO + '.js'
39+
importScripts(modulePath)
40+
ioToModule[trialIO] = Module
41+
ioModule = Module
42+
}
43+
const imageIO = new ioModule.ITKImageIO()
44+
const blob = new Blob([input.buffer])
45+
const blobs = [{ name: input.name, data: blob }]
46+
const mountpoint = '/work'
47+
ioModule.mountBlobs(mountpoint, blobs)
48+
const filePath = mountpoint + '/' + input.name
49+
const image = readImageEmscriptenFSFile(ioModule, filePath)
50+
imageIO.SetFileName(filePath)
51+
if (imageIO.CanReadFile(filePath)) {
52+
io = trialIO
53+
ioModule.unmountBlobs(mountpoint)
54+
break
55+
}
56+
ioModule.unmountBlobs(mountpoint)
57+
}
3258
}
3359
if (io === null) {
3460
return Error('Could not find IO for: ' + input.name)

src/itkGE4ImageIOJSBinding.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 "itkGE4ImageIO.h"
23+
24+
#include "itkImageIOBaseJSBinding.h"
25+
26+
typedef itk::ImageIOBaseJSBinding< itk::GE4ImageIO > GE4ImageIOJSBindingType;
27+
28+
EMSCRIPTEN_BINDINGS(itk_vtk_image_io_js_binding) {
29+
emscripten::register_vector<double>("AxisDirectionType");
30+
emscripten::enum_<GE4ImageIOJSBindingType::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_<GE4ImageIOJSBindingType::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_<GE4ImageIOJSBindingType>("ITKImageIO")
62+
.constructor<>()
63+
.function("SetNumberOfDimensions", &GE4ImageIOJSBindingType::SetNumberOfDimensions)
64+
.function("GetNumberOfDimensions", &GE4ImageIOJSBindingType::GetNumberOfDimensions)
65+
.function("SetFileName", &GE4ImageIOJSBindingType::SetFileName)
66+
.function("GetFileName", &GE4ImageIOJSBindingType::GetFileName)
67+
.function("CanReadFile", &GE4ImageIOJSBindingType::CanReadFile)
68+
.function("ReadImageInformation", &GE4ImageIOJSBindingType::ReadImageInformation)
69+
.function("SetDimensions", &GE4ImageIOJSBindingType::SetDimensions)
70+
.function("GetDimensions", &GE4ImageIOJSBindingType::GetDimensions)
71+
.function("SetOrigin", &GE4ImageIOJSBindingType::SetOrigin)
72+
.function("GetOrigin", &GE4ImageIOJSBindingType::GetOrigin)
73+
.function("SetSpacing", &GE4ImageIOJSBindingType::SetSpacing)
74+
.function("GetSpacing", &GE4ImageIOJSBindingType::GetSpacing)
75+
.function("SetDirection", &GE4ImageIOJSBindingType::SetDirection)
76+
.function("GetDirection", &GE4ImageIOJSBindingType::GetDirection)
77+
.function("GetDefaultDirection", &GE4ImageIOJSBindingType::GetDefaultDirection)
78+
.function("SetPixelType", &GE4ImageIOJSBindingType::SetPixelType)
79+
.function("GetPixelType", &GE4ImageIOJSBindingType::GetPixelType)
80+
.function("SetComponentType", &GE4ImageIOJSBindingType::SetComponentType)
81+
.function("GetComponentType", &GE4ImageIOJSBindingType::GetComponentType)
82+
.class_function("GetPixelTypeAsString", &GE4ImageIOJSBindingType::GetPixelTypeAsString)
83+
.class_function("GetComponentTypeAsString", &GE4ImageIOJSBindingType::GetComponentTypeAsString)
84+
.function("GetImageSizeInPixels", &GE4ImageIOJSBindingType::GetImageSizeInPixels)
85+
.function("GetImageSizeInBytes", &GE4ImageIOJSBindingType::GetImageSizeInBytes)
86+
.function("GetImageSizeInComponents", &GE4ImageIOJSBindingType::GetImageSizeInComponents)
87+
.function("SetNumberOfComponents", &GE4ImageIOJSBindingType::SetNumberOfComponents)
88+
.function("GetNumberOfComponents", &GE4ImageIOJSBindingType::GetNumberOfComponents)
89+
.function("Read", &GE4ImageIOJSBindingType::Read)
90+
;
91+
}

src/itkGE5ImageIOJSBinding.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 "itkGE5ImageIO.h"
23+
24+
#include "itkImageIOBaseJSBinding.h"
25+
26+
typedef itk::ImageIOBaseJSBinding< itk::GE5ImageIO > GE5ImageIOJSBindingType;
27+
28+
EMSCRIPTEN_BINDINGS(itk_vtk_image_io_js_binding) {
29+
emscripten::register_vector<double>("AxisDirectionType");
30+
emscripten::enum_<GE5ImageIOJSBindingType::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_<GE5ImageIOJSBindingType::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_<GE5ImageIOJSBindingType>("ITKImageIO")
62+
.constructor<>()
63+
.function("SetNumberOfDimensions", &GE5ImageIOJSBindingType::SetNumberOfDimensions)
64+
.function("GetNumberOfDimensions", &GE5ImageIOJSBindingType::GetNumberOfDimensions)
65+
.function("SetFileName", &GE5ImageIOJSBindingType::SetFileName)
66+
.function("GetFileName", &GE5ImageIOJSBindingType::GetFileName)
67+
.function("CanReadFile", &GE5ImageIOJSBindingType::CanReadFile)
68+
.function("ReadImageInformation", &GE5ImageIOJSBindingType::ReadImageInformation)
69+
.function("SetDimensions", &GE5ImageIOJSBindingType::SetDimensions)
70+
.function("GetDimensions", &GE5ImageIOJSBindingType::GetDimensions)
71+
.function("SetOrigin", &GE5ImageIOJSBindingType::SetOrigin)
72+
.function("GetOrigin", &GE5ImageIOJSBindingType::GetOrigin)
73+
.function("SetSpacing", &GE5ImageIOJSBindingType::SetSpacing)
74+
.function("GetSpacing", &GE5ImageIOJSBindingType::GetSpacing)
75+
.function("SetDirection", &GE5ImageIOJSBindingType::SetDirection)
76+
.function("GetDirection", &GE5ImageIOJSBindingType::GetDirection)
77+
.function("GetDefaultDirection", &GE5ImageIOJSBindingType::GetDefaultDirection)
78+
.function("SetPixelType", &GE5ImageIOJSBindingType::SetPixelType)
79+
.function("GetPixelType", &GE5ImageIOJSBindingType::GetPixelType)
80+
.function("SetComponentType", &GE5ImageIOJSBindingType::SetComponentType)
81+
.function("GetComponentType", &GE5ImageIOJSBindingType::GetComponentType)
82+
.class_function("GetPixelTypeAsString", &GE5ImageIOJSBindingType::GetPixelTypeAsString)
83+
.class_function("GetComponentTypeAsString", &GE5ImageIOJSBindingType::GetComponentTypeAsString)
84+
.function("GetImageSizeInPixels", &GE5ImageIOJSBindingType::GetImageSizeInPixels)
85+
.function("GetImageSizeInBytes", &GE5ImageIOJSBindingType::GetImageSizeInBytes)
86+
.function("GetImageSizeInComponents", &GE5ImageIOJSBindingType::GetImageSizeInComponents)
87+
.function("SetNumberOfComponents", &GE5ImageIOJSBindingType::SetNumberOfComponents)
88+
.function("GetNumberOfComponents", &GE5ImageIOJSBindingType::GetNumberOfComponents)
89+
.function("Read", &GE5ImageIOJSBindingType::Read)
90+
;
91+
}

0 commit comments

Comments
 (0)