Skip to content

Commit cca82cd

Browse files
committed
Add converter plugins for ImgLib2 types
1 parent f85aaac commit cca82cd

File tree

4 files changed

+151
-7
lines changed

4 files changed

+151
-7
lines changed

pom.xml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,22 +115,27 @@
115115
<version>${appose.version}</version>
116116
</dependency>
117117

118-
<!-- Test dependencies -->
118+
<!-- TODO: Move the image-specific parts of this code to a dedicated imagej-appose component. -->
119+
<!-- ImgLib2 dependencies -->
119120
<dependency>
120-
<groupId>junit</groupId>
121-
<artifactId>junit</artifactId>
122-
<scope>test</scope>
121+
<groupId>net.imglib2</groupId>
122+
<artifactId>imglib2</artifactId>
123123
</dependency>
124124
<dependency>
125125
<groupId>net.imglib2</groupId>
126126
<artifactId>imglib2-appose</artifactId>
127127
<version>${imglib2-appose.version}</version>
128-
<scope>test</scope>
129128
</dependency>
129+
<!-- ImageJ2 dependencies -->
130130
<dependency>
131-
<!-- For net.imglib2.img.Img parameter handling. -->
132131
<groupId>net.imagej</groupId>
133132
<artifactId>imagej-common</artifactId>
133+
</dependency>
134+
135+
<!-- Test dependencies -->
136+
<dependency>
137+
<groupId>junit</groupId>
138+
<artifactId>junit</artifactId>
134139
<scope>test</scope>
135140
</dependency>
136141
</dependencies>

src/main/java/org/scijava/plugins/scripting/appose/python/ApposePythonScriptLanguage.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929

3030
package org.scijava.plugins.scripting.appose.python;
3131

32-
import java.util.Arrays;
3332
import java.util.Collections;
3433
import java.util.List;
3534

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* #%L
3+
* Python scripting language plugin to be used via scyjava.
4+
* %%
5+
* Copyright (C) 2021 - 2025 SciJava developers.
6+
* %%
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright notice,
11+
* this list of conditions and the following disclaimer.
12+
* 2. Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
*
16+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
* POSSIBILITY OF SUCH DAMAGE.
27+
* #L%
28+
*/
29+
30+
package org.scijava.plugins.scripting.appose.python;
31+
32+
import org.apposed.appose.NDArray;
33+
import org.scijava.convert.Converter;
34+
import org.scijava.plugin.Plugin;
35+
36+
import net.imagej.convert.ConciseConverter;
37+
import net.imglib2.img.Img;
38+
import net.imglib2.img.planar.PlanarImgFactory;
39+
import net.imglib2.appose.ShmImg;
40+
import net.imglib2.type.NativeType;
41+
import net.imglib2.util.ImgUtil;
42+
43+
/**
44+
* Converts an Appose {@link NDArray} to an ImgLib2 {@link Img}.
45+
* <p>
46+
* The {@code NDArray} is first wrapped as a {@link ShmImg}, then copied into a
47+
* {@link net.imglib2.img.planar.PlanarImg}. The copy step is necessary because
48+
* {@code ShmImg} is backed by a direct NIO buffer (not a Java primitive array),
49+
* which is incompatible with ImageJ1's {@code ImageProcessorUtils}.
50+
* </p>
51+
*
52+
* @author Curtis Rueden
53+
*/
54+
@SuppressWarnings("rawtypes")
55+
@Plugin(type = Converter.class)
56+
public class NDArrayToImgConverter extends ConciseConverter<NDArray, Img> {
57+
58+
public NDArrayToImgConverter() {
59+
super(NDArray.class, Img.class, NDArrayToImgConverter::doConvert);
60+
}
61+
62+
private static <T extends NativeType<T>> Img<T> doConvert(
63+
final NDArray ndArray)
64+
{
65+
final ShmImg<T> shmImg = new ShmImg<>(ndArray);
66+
final PlanarImgFactory<T> factory =
67+
new PlanarImgFactory<>(shmImg.getType());
68+
final Img<T> result = factory.create(shmImg);
69+
ImgUtil.copy(shmImg, result);
70+
return result;
71+
}
72+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* #%L
3+
* Python scripting language plugin to be used via scyjava.
4+
* %%
5+
* Copyright (C) 2021 - 2025 SciJava developers.
6+
* %%
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright notice,
11+
* this list of conditions and the following disclaimer.
12+
* 2. Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
*
16+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
* POSSIBILITY OF SUCH DAMAGE.
27+
* #L%
28+
*/
29+
30+
package org.scijava.plugins.scripting.appose.python;
31+
32+
import org.apposed.appose.NDArray;
33+
import org.scijava.convert.Converter;
34+
import org.scijava.plugin.Plugin;
35+
36+
import net.imagej.convert.ConciseConverter;
37+
import net.imglib2.RandomAccessibleInterval;
38+
import net.imglib2.appose.NDArrays;
39+
import net.imglib2.type.NativeType;
40+
41+
/**
42+
* Converts a {@link RandomAccessibleInterval} to an Appose {@link NDArray}.
43+
* <p>
44+
* If the input already wraps an {@code NDArray} (e.g., a {@code ShmImg}),
45+
* the existing {@code NDArray} is returned without copying. Otherwise the
46+
* image is copied into a new shared-memory {@code NDArray}.
47+
* </p>
48+
*
49+
* @author Curtis Rueden
50+
*/
51+
@SuppressWarnings("rawtypes")
52+
@Plugin(type = Converter.class)
53+
public class RAIToNDArrayConverter
54+
extends ConciseConverter<RandomAccessibleInterval, NDArray>
55+
{
56+
57+
public RAIToNDArrayConverter() {
58+
//noinspection unchecked
59+
super(RandomAccessibleInterval.class, NDArray.class,
60+
RAIToNDArrayConverter::doConvert);
61+
}
62+
63+
private static <T extends NativeType<T>> NDArray doConvert(
64+
final RandomAccessibleInterval<T> rai)
65+
{
66+
return NDArrays.asNDArray(rai);
67+
}
68+
}

0 commit comments

Comments
 (0)