Skip to content

Commit 505efb8

Browse files
authored
Merge pull request #42 from thewtex/jpeg
feat(formats): add JPEG ImageIO support.
2 parents dc9e120 + cce8662 commit 505efb8

10 files changed

Lines changed: 139 additions & 0 deletions

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ project(BridgeJavaScript)
44
set(BridgeJavaScript_IOModules
55
"ITKIOBMP"
66
"ITKIOGDCM"
7+
"ITKIOJPEG"
78
"ITKIOMeta"
89
"ITKIONIFTI"
910
"ITKIONRRD"
@@ -18,6 +19,7 @@ set(imageio_ITKIOMeta itkMetaImageIO)
1819
set(imageio_ITKIONIFTI itkNiftiImageIO)
1920
set(imageio_ITKIONRRD itkNrrdImageIO)
2021
set(imageio_ITKIOGDCM itkGDCMImageIO)
22+
set(imageio_ITKIOJPEG itkJPEGImageIO)
2123
set(imageio_ITKIOTIFF itkTIFFImageIO)
2224
set(imageio_ITKIOVTK itkVTKImageIO)
2325

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Provides general scientific image IO capability and bridges
1010

1111
- [BMP](https://en.wikipedia.org/wiki/BMP_file_format)
1212
- [DICOM](http://dicom.nema.org/)
13+
- [JPEG](https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format)
1314
- [MetaImage](https://itk.org/Wiki/ITK/MetaIO/Documentation)
1415
- [NifTi](https://nifti.nimh.nih.gov/nifti-1)
1516
- [NRRD](http://teem.sourceforge.net/nrrd/format.html)

src/MimeToIO.js

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

3+
mimeToIO['image/jpeg'] = 'itkJPEGImageIOJSBinding'
34
mimeToIO['image/png'] = 'itkPNGImageIOJSBinding'
45
mimeToIO['image/tiff'] = 'itkTIFFImageIOJSBinding'
56
mimeToIO['image/x-ms-bmp'] = 'itkBMPImageIOJSBinding'

src/extensionToIO.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ extensionToIO['BMP'] = 'itkBMPImageIOJSBinding'
66
extensionToIO['dcm'] = 'itkGDCMImageIOJSBinding'
77
extensionToIO['DCM'] = 'itkGDCMImageIOJSBinding'
88

9+
extensionToIO['jpg'] = 'itkJPEGImageIOJSBinding'
10+
extensionToIO['JPG'] = 'itkJPEGImageIOJSBinding'
11+
extensionToIO['jpeg'] = 'itkJPEGImageIOJSBinding'
12+
extensionToIO['JPEG'] = 'itkJPEGImageIOJSBinding'
13+
914
extensionToIO['mha'] = 'itkMetaImageIOJSBinding'
1015
extensionToIO['mhd'] = 'itkMetaImageIOJSBinding'
1116

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

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ ExternalData_Expand_Arguments(
2727
DATA{Input/ShortTestImage.tiff}
2828
DATA{Input/r16slice.nii.gz}
2929
DATA{Input/image_color.bmp}
30+
DATA{Input/apple.jpg}
3031
)

test/Input/apple.jpg.md5

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

test/MimeToIOTest.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/jpeg maps to itkJPEGImageIOJSBinding', t => {
12+
let io = MimeToIO['image/jpeg']
13+
t.is(io, 'itkJPEGImageIOJSBinding')
14+
})
15+
1116
test('image/tiff maps to itkTIFFImageIOJSBinding', t => {
1217
let io = MimeToIO['image/tiff']
1318
t.is(io, 'itkTIFFImageIOJSBinding')

test/extensionToIOTest.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ test('bmp maps to itkBMPImageIOJSBinding', t => {
88
t.is(io, 'itkBMPImageIOJSBinding')
99
})
1010

11+
test('jpeg maps to itkJPEGImageIOJSBinding', t => {
12+
let io = ExtensionToIO['jpeg']
13+
t.is(io, 'itkJPEGImageIOJSBinding')
14+
})
15+
16+
test('jpg maps to itkJPEGImageIOJSBinding', t => {
17+
let io = ExtensionToIO['jpg']
18+
t.is(io, 'itkJPEGImageIOJSBinding')
19+
})
20+
1121
test('png maps to itkPNGImageIOJSBinding', t => {
1222
let io = ExtensionToIO['png']
1323
t.is(io, 'itkPNGImageIOJSBinding')

test/formatsTest.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,28 @@ test('Test reading a BMP file', t => {
4949
})
5050
})
5151

52+
test('Test reading a JPEG file', t => {
53+
const testFilePath = path.resolve(__dirname, '..', 'build', 'ExternalData', 'test', 'Input', 'apple.jpg')
54+
return readImageLocalFile(testFilePath).then(function (image) {
55+
t.is(image.imageType.dimension, 2, 'dimension')
56+
t.is(image.imageType.componentType, IntTypes.UInt8, 'componentType')
57+
t.is(image.imageType.pixelType, PixelTypes.RGB, 'pixelType')
58+
t.is(image.imageType.components, 3, 'components')
59+
t.is(image.origin[0], 0.0, 'origin[0]')
60+
t.is(image.origin[1], 0.0, 'origin[1]')
61+
t.is(image.spacing[0], 0.35277777777777775, 'spacing[0]')
62+
t.is(image.spacing[1], 0.35277777777777775, 'spacing[1]')
63+
t.is(image.direction.getElement(0, 0), 1.0, 'direction (0, 0)')
64+
t.is(image.direction.getElement(0, 1), 0.0, 'direction (0, 1)')
65+
t.is(image.direction.getElement(1, 0), 0.0, 'direction (1, 0)')
66+
t.is(image.direction.getElement(1, 1), 1.0, 'direction (1, 1)')
67+
t.is(image.size[0], 160, 'size[0]')
68+
t.is(image.size[1], 179, 'size[1]')
69+
t.is(image.buffer.length, 85920, 'buffer.length')
70+
t.is(image.buffer[1000], 255, 'buffer[1000]')
71+
})
72+
})
73+
5274
test('Test reading a TIFF file', t => {
5375
const testFilePath = path.resolve(__dirname, '..', 'build', 'ExternalData', 'test', 'Input', 'ShortTestImage.tiff')
5476
return readImageLocalFile(testFilePath).then(function (image) {

0 commit comments

Comments
 (0)