Skip to content

Commit 02b55b6

Browse files
authored
Merge pull request #34 from thewtex/tiff
feat(formats): add TIFF support
2 parents d0610ba + deebabf commit 02b55b6

10 files changed

Lines changed: 154 additions & 0 deletions

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ set(BridgeJavaScript_IOModules
66
"ITKIOMeta"
77
"ITKIONRRD"
88
"ITKIOPNG"
9+
"ITKIOTIFF"
910
"ITKIOVTK"
1011
CACHE STRING
1112
"String delimited list of ITK IO modules to support.")
1213
set(imageio_ITKIOPNG itkPNGImageIO)
1314
set(imageio_ITKIOMeta itkMetaImageIO)
1415
set(imageio_ITKIONRRD itkNrrdImageIO)
1516
set(imageio_ITKIOGDCM itkGDCMImageIO)
17+
set(imageio_ITKIOTIFF itkTIFFImageIO)
1618
set(imageio_ITKIOVTK itkVTKImageIO)
1719

1820

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
- [MetaImage](https://itk.org/Wiki/ITK/MetaIO/Documentation)
1313
- [NRRD](http://teem.sourceforge.net/nrrd/format.html)
1414
- [Portable Network Graphics (PNG)](https://en.wikipedia.org/wiki/Portable_Network_Graphics)
15+
- [Tagged Image File Format (TIFF)](https://en.wikipedia.org/wiki/TIFF)
1516
- [VTK legacy image file format](http://www.vtk.org/VTK/img/file-formats.pdf)
1617

1718
## Hacking ITKBridgeJavaScript

src/itkExtensionToIO.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ extensionToIO['NHDR'] = 'itkNrrdImageIOJSBinding'
1414
extensionToIO['png'] = 'itkPNGImageIOJSBinding'
1515
extensionToIO['PNG'] = 'itkPNGImageIOJSBinding'
1616

17+
extensionToIO['tif'] = 'itkTIFFImageIOJSBinding'
18+
extensionToIO['TIF'] = 'itkTIFFImageIOJSBinding'
19+
extensionToIO['tiff'] = 'itkTIFFImageIOJSBinding'
20+
extensionToIO['TIFF'] = 'itkTIFFImageIOJSBinding'
21+
1722
extensionToIO['vtk'] = 'itkVTKImageIOJSBinding'
1823
extensionToIO['VTK'] = 'itkVTKImageIOJSBinding'
1924

src/itkMimeToIO.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
let mimeToIO = {}
22

33
mimeToIO['image/png'] = 'itkPNGImageIOJSBinding'
4+
mimeToIO['image/tiff'] = 'itkTIFFImageIOJSBinding'
45
mimeToIO['application/dicom'] = 'itkGDCMImageIOJSBinding'
56

67
module.exports = mimeToIO

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

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ ExternalData_Expand_Arguments(
2424
DATA{Input/vol-raw-little.nrrd}
2525
DATA{Input/1.3.6.1.4.1.5962.99.1.3814087073.479799962.1489872804257.100.0.dcm}
2626
DATA{Input/ironProt.vtk}
27+
DATA{Input/ShortTestImage.tiff}
2728
)

test/Input/ShortTestImage.tiff.md5

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

test/formatsTest.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,28 @@ test('Test reading a PNG file', t => {
2929
})
3030
})
3131

32+
test('Test reading a TIFF file', t => {
33+
const testFilePath = path.resolve(__dirname, '..', 'build', 'ExternalData', 'test', 'Input', 'ShortTestImage.tiff')
34+
return readImageLocalFile(testFilePath).then(function (image) {
35+
t.is(image.imageType.dimension, 2, 'dimension')
36+
t.is(image.imageType.componentType, IntTypes.Int16, 'componentType')
37+
t.is(image.imageType.pixelType, PixelTypes.Scalar, 'pixelType')
38+
t.is(image.imageType.components, 1, 'components')
39+
t.is(image.origin[0], 0.0, 'origin[0]')
40+
t.is(image.origin[1], 0.0, 'origin[1]')
41+
t.is(image.spacing[0], 1.0, 'spacing[0]')
42+
t.is(image.spacing[1], 1.0, 'spacing[1]')
43+
t.is(image.direction.getElement(0, 0), 1.0, 'direction (0, 0)')
44+
t.is(image.direction.getElement(0, 1), 0.0, 'direction (0, 1)')
45+
t.is(image.direction.getElement(1, 0), 0.0, 'direction (1, 0)')
46+
t.is(image.direction.getElement(1, 1), 1.0, 'direction (1, 1)')
47+
t.is(image.size[0], 20, 'size[0]')
48+
t.is(image.size[1], 20, 'size[1]')
49+
t.is(image.buffer.length, 400, 'buffer.length')
50+
t.is(image.buffer[100], -9, 'buffer[100]')
51+
})
52+
})
53+
3254
test('Test reading a NRRD file', t => {
3355
const testFilePath = path.resolve(__dirname, '..', 'build', 'ExternalData', 'test', 'Input', 'vol-raw-little.nrrd')
3456
return readImageLocalFile(testFilePath).then(function (image) {

test/itkExtensionToIOTest.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,32 @@ test('dcm maps to itkGDCMImageIOJSBinding', t => {
3333
t.is(io, 'itkGDCMImageIOJSBinding')
3434
})
3535

36+
test('tif maps to itkTIFFImageIOJSBinding', t => {
37+
let io = ExtensionToIO['tif']
38+
t.is(io, 'itkTIFFImageIOJSBinding')
39+
})
40+
41+
test('TIF maps to itkTIFFImageIOJSBinding', t => {
42+
let io = ExtensionToIO['TIF']
43+
t.is(io, 'itkTIFFImageIOJSBinding')
44+
})
45+
46+
test('tiff maps to itkTIFFImageIOJSBinding', t => {
47+
let io = ExtensionToIO['tiff']
48+
t.is(io, 'itkTIFFImageIOJSBinding')
49+
})
50+
51+
test('TIFF maps to itkTIFFImageIOJSBinding', t => {
52+
let io = ExtensionToIO['TIFF']
53+
t.is(io, 'itkTIFFImageIOJSBinding')
54+
})
55+
3656
test('vtk maps to itkVTKImageIOJSBinding', t => {
3757
let io = ExtensionToIO['vtk']
3858
t.is(io, 'itkVTKImageIOJSBinding')
3959
})
60+
61+
test('VTK maps to itkVTKImageIOJSBinding', t => {
62+
let io = ExtensionToIO['VTK']
63+
t.is(io, 'itkVTKImageIOJSBinding')
64+
})

test/itkMimeToIOTest.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ test('image/png maps to itkPNGImageIOJSBinding', t => {
88
t.is(io, 'itkPNGImageIOJSBinding')
99
})
1010

11+
test('image/tiff maps to itkTIFFImageIOJSBinding', t => {
12+
let io = MimeToIO['image/tiff']
13+
t.is(io, 'itkTIFFImageIOJSBinding')
14+
})
15+
1116
test('application/dicom maps to itkGDCMImageIOJSBinding', t => {
1217
let io = MimeToIO['application/dicom']
1318
t.is(io, 'itkGDCMImageIOJSBinding')

0 commit comments

Comments
 (0)