forked from scifio/scifio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SCIFIOImgPlus.java
201 lines (168 loc) · 5.78 KB
/
SCIFIOImgPlus.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
* #%L
* SCIFIO library for reading and converting scientific file formats.
* %%
* Copyright (C) 2011 - 2021 SCIFIO developers.
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/
package io.scif.img;
import io.scif.FormatException;
import io.scif.ImageMetadata;
import io.scif.Metadata;
import io.scif.filters.MetadataWrapper;
import io.scif.img.cell.SCIFIOCellImg;
import java.io.IOException;
import net.imagej.ImgPlus;
import net.imagej.ImgPlusMetadata;
import net.imagej.axis.AxisType;
import net.imglib2.display.ColorTable;
import net.imglib2.img.Img;
import org.scijava.Disposable;
/**
* SCIFIO extension of {@link ImgPlus} that adds
* {@link #getColorTable(int, int)} API for specifying both the plane and image
* index.
* <p>
* Also provides direct access to the {@link Metadata} object associated with
* the underlying dataset.
* </p>
*
* @author Mark Hiner
*/
public class SCIFIOImgPlus<T> extends ImgPlus<T> implements Disposable {
// -- Constants --
public static final String GLOBAL_META = "scifio.metadata.global";
public static final String IMAGE_META = "scifio.metadata.image";
// -- Constructors --
public SCIFIOImgPlus(final Img<T> img) {
super(img);
}
public SCIFIOImgPlus(final Img<T> img, final String name) {
super(img, name);
}
public SCIFIOImgPlus(final Img<T> img, final String name,
final AxisType[] axes)
{
super(img, name, axes);
}
public SCIFIOImgPlus(final Img<T> img, final ImgPlusMetadata metadata) {
super(img, metadata);
}
public SCIFIOImgPlus(final Img<T> img, final String name,
final AxisType[] axes, final double[] cal)
{
super(img, name, axes, cal);
}
public SCIFIOImgPlus(final ImgPlus<T> imgPlus) {
this(imgPlus.getImg(), imgPlus);
}
// -- SCIFIOImgPlus Methods --
/**
* @return The SCIFIO {@link Metadata} object attached to this ImgPlus.
*/
public Metadata getMetadata() {
return (Metadata) getProperties().get(GLOBAL_META);
}
/**
* Sets the {@link Metadata} object for this ImgPlus.
*/
public void setMetadata(final Metadata meta) {
getProperties().put(GLOBAL_META, meta);
}
/**
* @return The SCIFIO {@link ImageMetadata} object attached to this ImgPlus.
*/
public ImageMetadata getImageMetadata() {
return (ImageMetadata) getProperties().get(IMAGE_META);
}
/**
* Sets the {@link ImageMetadata} object for this ImgPlus.
*/
public void setImageMetadata(final ImageMetadata imageMeta) {
getProperties().put(IMAGE_META, imageMeta);
}
// -- ImgPlus Methods --
@Override
public ColorTable getColorTable(final int planeIndex) {
return getColorTable(0, planeIndex);
}
/**
* @param imageIndex - Image index to look up the color table
* @param planeIndex - Plane index of the desired color table
* @return The ColorTable of the underlying dataset at the specified indices.
*/
public ColorTable getColorTable(final int imageIndex, final int planeIndex) {
ColorTable table = super.getColorTable(planeIndex);
if (table == null && SCIFIOCellImg.class.isAssignableFrom(getImg()
.getClass()))
{
try {
table = ((SCIFIOCellImg<?, ?>) getImg()).getColorTable(imageIndex,
planeIndex);
}
catch (final FormatException e) {
return null;
}
catch (final IOException e) {
return null;
}
setColorTable(table, planeIndex);
}
return table;
}
@Override
public SCIFIOImgPlus<T> copy() {
final SCIFIOImgPlus<T> copy = new SCIFIOImgPlus<>(getImg().copy(), this);
copy.setMetadata(getMetadata());
return copy;
}
// -- Disposable methods --
@Override
public void dispose() {
final Object img = getImg();
if (img instanceof Disposable) {
((Disposable) img).dispose();
}
}
// -- Internal methods --
/**
* Sets the ROIs and tables properties based on the {@link ImageMetadata}. If
* the given {@link Metadata} is a {@link MetadataWrapper}, this method will
* recurse through the layers searching for the first filled ROIs and tables
* fields.
*
* @param meta the {@link Metadata} whose associated {@link ImageMetadata}
* will be checked
* @param index the index of the {@link ImageMetadata}
*/
void setROIsAndTablesProperties(final Metadata meta, final int index) {
final boolean roisSet = getProperties().get("rois") != null;
final boolean tablesSet = getProperties().get("tables") != null;
if (roisSet && tablesSet) return;
if (!roisSet) getProperties().put("rois", meta.get(index).getROIs());
if (!tablesSet) getProperties().put("tables", meta.get(index).getTables());
if (meta instanceof MetadataWrapper) setROIsAndTablesProperties(
((MetadataWrapper) meta).unwrap(), index);
}
}