[ome-devel] Channel Plane Names Set but not Recognised in ImageJ/BioFormats Plugin

Michael Ellis michael.ellis at dsuk.biz
Thu Oct 13 11:08:06 BST 2016

Dear ome-devel list.

I am trying to use the bioformats_package.jar in my Java app to save a single image file comprising multiple channels (each channel acquired with a different fluorescence filter set). I am using the setChannelName() and this appears to work insofar as I can see the entry being created in the resulting OME-XML data contained within the the .ome.tif file. However, if I use ImageJ with the BioFormats importer plugin, the multi channel image is loaded and displayed, but the channel names are set not to the names I specify, but “c1/4”, “c:2/4”, “c3/4”, “c:4/4”.

My SSCCE is as follows:

public class BioFormatsTest2 {

    private IMetadata createMetadata(int width, int height, int pixelType, String[] channelNames, Color[] channelColors) {
        IMetadata meta;
        try {
            // create the OME-XML metadata storage object
            ServiceFactory factory = new ServiceFactory();
            OMEXMLService service = factory.getInstance(OMEXMLService.class);
            meta = service.createOMEXMLMetadata();

            // define each stack of images - this defines a single stack of images
            meta.setImageID("Image:0", 0);
            meta.setPixelsID("Pixels:0", 0);

            // specify that the pixel data is stored in big-endian format
            // change 'TRUE' to 'FALSE' to specify little-endian format
            meta.setPixelsBinDataBigEndian(Boolean.TRUE, 0, 0);

            // specify that the images are stored in ZCT order
            meta.setPixelsDimensionOrder(DimensionOrder.XYCZT, 0);

            // specify that the pixel type of the images
                    PixelType.fromString(FormatTools.getPixelTypeString(pixelType)), 0);

            // specify the dimensions of the images
            meta.setPixelsSizeX(new PositiveInteger(width), 0);
            meta.setPixelsSizeY(new PositiveInteger(height), 0);
            meta.setPixelsSizeZ(new PositiveInteger(1), 0);
            meta.setPixelsSizeC(new PositiveInteger(channelNames.length), 0);
            meta.setPixelsSizeT(new PositiveInteger(1), 0);

            for (int channel = 0; channel < channelNames.length; channel++) {
                meta.setChannelID("Channel:0:" + channel, 0, channel);
                meta.setChannelSamplesPerPixel(new PositiveInteger(1), 0, channel);
                meta.setChannelName(channelNames[channel], 0, channel);
                ome.xml.model.primitives.Color c = new ome.xml.model.primitives.Color(channelColors[channel].getRGB());
                meta.setChannelColor(c, 0, channel);
        } catch (DependencyException | ServiceException | EnumerationException e) {
            System.err.println("Failed to populate OME-XML metadata object.");
            meta = null;

        return meta;

    public static void main(String[] args) throws Exception {
        BioFormatsTest2 exporter = new BioFormatsTest2();

    public void run() throws IOException, FormatException {
        int width = 256, height = 256;
        int pixelType = FormatTools.UINT8;
        String[] channelNames = {"Dapi", "Fitc", "TxRed", "Aqua"};
        Color[] channelColors = {Color.BLUE, Color.GREEN, Color.RED, Color.CYAN};
        String filePath = "/Users/michaelellis/Documents/Development/SmartCapture4/BioFormat2.ome.tif";

        // Create image data buffer;
        byte[] img = new byte[width * height * FormatTools.getBytesPerPixel(pixelType)];

        try (ImageWriter writer = new ImageWriter()) {
            IMetadata omexml = createMetadata(width, height, pixelType, channelNames, channelColors);

            // only save a plane if the file writer was initialized successfully
            for (int planeIndex = 0; planeIndex < channelNames.length; ++planeIndex) {
                // savePlane(planeIndex, width, height, pixelType);
                // byte[] plane = createImage(width, height, pixelType);

                // fill it with random data
                for (int i = 0; i < img.length; i++) {
                    img[i] = (byte) (256 * Math.random());

                writer.saveBytes(planeIndex, img);

        } // Autoclose writer



The OME-XML in the .ome.tif file is as follows. Note that channel names appear to be Dapi, Fitc, TxRed and Aqua

 <OME UUID="urn:uuid:42b524fd-b842-4052-bf6c-5977c9d06a97" xmlns="http://www.openmicroscopy.org/Schemas/OME/2015-01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openmicroscopy.org/Schemas/OME/2015-01 http://www.openmicroscopy.org/Schemas/OME/2015-01/ome.xsd">
 <Image ID="Image:0">
 <Pixels BigEndian="true" DimensionOrder="XYCZT" ID="Pixels:0" Interleaved="false" SignificantBits="8" SizeC="4" SizeT="1" SizeX="256" SizeY="256" SizeZ="1" Type="uint8">
 <Channel Color="-16776961" ID="Channel:0:0" Name="Dapi" SamplesPerPixel="1">
 <Channel Color="-16711936" ID="Channel:0:1" Name="Fitc" SamplesPerPixel="1">
 <Channel Color="-65536" ID="Channel:0:2" Name="TxRed" SamplesPerPixel="1">
 <Channel Color="-16711681" ID="Channel:0:3" Name="Aqua" SamplesPerPixel="1">
 <TiffData FirstC="0" FirstT="0" FirstZ="0" IFD="0" PlaneCount="1">
 <UUID FileName="BioFormat2.ome.tif">urn:uuid:42b524fd-b842-4052-bf6c-5977c9d06a97</UUID>
 <TiffData FirstC="1" FirstT="0" FirstZ="0" IFD="1" PlaneCount="1">
 <UUID FileName="BioFormat2.ome.tif">urn:uuid:42b524fd-b842-4052-bf6c-5977c9d06a97</UUID>
 <TiffData FirstC="2" FirstT="0" FirstZ="0" IFD="2" PlaneCount="1">
 <UUID FileName="BioFormat2.ome.tif">urn:uuid:42b524fd-b842-4052-bf6c-5977c9d06a97</UUID>
 <TiffData FirstC="3" FirstT="0" FirstZ="0" IFD="3" PlaneCount="1">
 <UUID FileName="BioFormat2.ome.tif">urn:uuid:42b524fd-b842-4052-bf6c-5977c9d06a97</UUID>

After loading the created image with the BioFormats Import plugin into Fiji and running the following script:

  IJ.log("nSlices=" + nSlices);

  for(i = 1; i <= nSlices; i=i+1) {
      name = getInfo("slice.label");
      IJ.log("Slice " + i + ": " + name);

The log output is: 

 Slice 1: c:1/4
 Slice 2: c:2/4
 Slice 3: c:3/4
 Slice 4: c:4/4

Also, consistent with the script output, the names displayed in the Fiji image window title show the plane names as “c1/4”, “c:2/4”, “c3/4”, “c:4/4”.

What am I doing wrong?
Am I doing something wrong?

Also, I have read the developer documentation at http://www.openmicroscopy.org/site/support/bio-formats5.2/developers/index.html <http://www.openmicroscopy.org/site/support/bio-formats5.2/developers/index.html> but either I am missing something or there is insufficient explanation for some of the items. For instance in the example http://www.openmicroscopy.org/site/support/bio-formats5.2/_downloads/FileExport.java <http://www.openmicroscopy.org/site/support/bio-formats5.2/_downloads/FileExport.java>, where can I find an explanation for the string identifiers used in the following calls:

	meta.setImageID("Image:0", 0);
	meta.setPixelsID(“Pixels:0", 0);
	meta.setChannelID(“Channel:0:0", 0, 0);

Any help gratefully appreciated!

— Michael Ellis

Michael Ellis (Managing Director)
Digital Scientific UK Ltd.
http://www.dsuk.biz <http://www.dsuk.biz/>
michael.ellis at dsuk.biz
tel: +44(0)1223 911215

The Commercial Centre
6 Green End
CB23 7DY

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openmicroscopy.org.uk/pipermail/ome-devel/attachments/20161013/9bc7a8fc/attachment.html>

More information about the ome-devel mailing list