Skip to content

Commit 38cc402

Browse files
authored
Merge pull request #4173 from melissalinkert/bfconvert-remove-channels
bfconvert: remove extra channels if `-channel` was used
2 parents 2a1c8b8 + be40e04 commit 38cc402

2 files changed

Lines changed: 52 additions & 3 deletions

File tree

components/bio-formats-tools/src/loci/formats/tools/ImageConverter.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.io.IOException;
4242
import java.util.Iterator;
4343
import java.util.HashMap;
44+
import java.util.List;
4445
import java.util.TreeMap;
4546
import java.util.SortedMap;
4647

@@ -86,6 +87,7 @@
8687
import loci.formats.services.OMEXMLServiceImpl;
8788

8889
import ome.xml.meta.OMEXMLMetadataRoot;
90+
import ome.xml.model.Channel;
8991
import ome.xml.model.Image;
9092
import ome.xml.model.Pixels;
9193
import ome.xml.model.enums.PixelType;
@@ -599,11 +601,22 @@ public boolean testConvert(IFormatWriter writer, String[] args)
599601
String xml = service.getOMEXML(service.asRetrieve(store));
600602
OMEXMLMetadataRoot root = (OMEXMLMetadataRoot) store.getRoot();
601603
IMetadata meta = service.createOMEXMLMetadata(xml);
604+
OMEXMLMetadataRoot newRoot = (OMEXMLMetadataRoot) meta.getRoot();
602605
if (series >= 0) {
603-
Image exportImage = new Image(root.getImage(series));
604-
Pixels exportPixels = new Pixels(root.getImage(series).getPixels());
606+
Image exportImage = newRoot.getImage(series);
607+
Pixels exportPixels = newRoot.getImage(series).getPixels();
608+
609+
if (channel >= 0) {
610+
List<Channel> channels = exportPixels.copyChannelList();
611+
612+
for (int c=0; c<channels.size(); c++) {
613+
if (c != channel) {
614+
exportPixels.removeChannel(channels.get(c));
615+
}
616+
}
617+
}
618+
605619
exportImage.setPixels(exportPixels);
606-
OMEXMLMetadataRoot newRoot = (OMEXMLMetadataRoot) meta.getRoot();
607620
while (newRoot.sizeOfImageList() > 0) {
608621
newRoot.removeImage(newRoot.getImage(0));
609622
}
@@ -647,6 +660,17 @@ public boolean testConvert(IFormatWriter writer, String[] args)
647660
store.setPixelsType(PixelType.UINT8, i);
648661
}
649662

663+
if (channel >= 0) {
664+
Pixels exportPixels = newRoot.getImage(i).getPixels();
665+
List<Channel> channels = exportPixels.copyChannelList();
666+
667+
for (int c=0; c<channels.size(); c++) {
668+
if (c != channel) {
669+
exportPixels.removeChannel(channels.get(c));
670+
}
671+
}
672+
}
673+
650674
if (channel >= 0) {
651675
meta.setPixelsSizeC(new PositiveInteger(1), i);
652676
}

components/bio-formats-tools/test/loci/formats/tools/ImageConverterTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,21 @@
4242
import java.util.ArrayList;
4343
import java.util.Arrays;
4444

45+
import loci.common.services.ServiceFactory;
4546
import loci.formats.ClassList;
4647
import loci.formats.IFormatReader;
4748
import loci.formats.ImageReader;
4849
import loci.formats.ImageWriter;
4950
import loci.formats.FormatException;
51+
import loci.formats.meta.IMetadata;
5052
import loci.formats.tools.ImageConverter;
5153
import loci.formats.in.ICSReader;
5254
import loci.formats.in.OMETiffReader;
5355
import loci.formats.in.TiffDelegateReader;
5456
import loci.formats.in.TiffReader;
5557
import loci.formats.out.OMETiffWriter;
58+
import loci.formats.services.OMEXMLService;
59+
import loci.formats.tiff.TiffParser;
5660

5761
import org.apache.commons.lang.ArrayUtils;
5862
import org.testng.annotations.AfterClass;
@@ -369,6 +373,27 @@ public void testConvertResolutions() throws FormatException, IOException {
369373
assertConversion(args);
370374
}
371375

376+
@Test
377+
public void testConvertSingleChannel() throws FormatException, IOException {
378+
outFile = getOutFile("single-channel.ome.tiff");
379+
String[] args = {
380+
"single-channel&sizeC=3.fake", "-channel", "1", outFile.getAbsolutePath()
381+
};
382+
assertConversion(args);
383+
384+
try (TiffParser parser = new TiffParser(outFile.getAbsolutePath())) {
385+
String comment = parser.getComment();
386+
387+
final OMEXMLService service =
388+
new ServiceFactory().getInstance(OMEXMLService.class);
389+
IMetadata meta = service.createOMEXMLMetadata(comment);
390+
assertEquals(meta.getChannelCount(0), 1);
391+
}
392+
catch (Exception e) {
393+
throw new FormatException(e);
394+
}
395+
}
396+
372397
private Path getTempSubdir() throws IOException {
373398
Path subdir = Files.createTempDirectory(tempDir, "ImageConverterTest");
374399
subdir.toFile().deleteOnExit();

0 commit comments

Comments
 (0)