<div dir="ltr">Hi Heinrich,<div><br></div><div><div>> I see you have the exact same omexml metadata string for every IFD.</div></div><div><br></div><div>Nope, you only put the OME-XML string into the first IFD of each TIFF file. Not subsequent IFDs.</div><div><br></div><div><div>> I was under the impression that you needed to specify the ZCT position</div><div>> for every plane separately.</div></div><div><br></div><div>You refer to the TiffData elements, right? If so, you do _not_ need a separate TiffData element per plane. You only need to define the mapping from IFD to ZCT coordinates in an unambiguous way. For full details, see:</div><div><br></div><div><a href="http://openmicroscopy.org/site/support/ome-model/ome-tiff/specification.html#the-tiffdata-element">http://openmicroscopy.org/site/support/ome-model/ome-tiff/specification.html#the-tiffdata-element</a><br></div><div><br></div><div>That said, you _would_ need to have one Plane element per plane if you want to include plane-specific metadata such as timings or plane-specific stage positions.</div><div><br></div><div><div>> However, as it is the same string for every plane, couldn’t you just</div><div>> write it once into the file and point at that position from every</div><div>> IFD’s ImageDescription?</div></div><div><br></div><div>Again, you do not need to populate the ImageDescription of any IFD other than the first.</div><div><br></div><div>Hope that helps,</div><div>Curtis</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 25, 2015 at 12:17 PM, Grabmayr, Heinrich <span dir="ltr"><<a href="mailto:Heinrich.Grabmayr@ph.tum.de" target="_blank">Heinrich.Grabmayr@ph.tum.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Hi Curtis<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Thanks for this insight!<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I have one more question left regarding the WiscScan code. As I see you have the exact same omexml metadata string for every IFD. From my earlier work on this,
I was under the impression that you needed to specify the ZCT position for every plane separately. But I just read that this is optional.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">However, as it is the same string for every plane, couldn’t you just write it once into the file and point at that position from every IFD’s ImageDescription?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Cheers<span class="HOEnZb"><font color="#888888"><u></u><u></u></font></span></span></p><span class="HOEnZb"><font color="#888888">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> Heinrich<u></u><u></u></span></p></font></span><div><div class="h5">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div>
<div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">[Resending to the actual ome-devel list, since that address got mangled in the reply chain before.]<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">> Could you elaborate a bit on how you do the OmeXML injection into the<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">> completed tiff? And why can't the stub description be longer than 4<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">> chars?<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">According to the TIFF specification [1], an IFD Directory Entry has a type, a length and a value/offset. The length and value/offset are each 4 bytes. The clever thing is if the value fits into 4 bytes or less, it is inlined, but if the
value is longer than 4 bytes, then those 4 bytes are treated as an offset into the file where the value is actually stored.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">So, you tell libtiff to write "xx" into the ImageDescription field, which will cause it to create a directory entry for ImageDescription when writing the TIFF header. Then later, after libtiff has closed out the TIFF file and considers
it done, you can append your actual OME-XML string to the file, then seek back to the ImageDescription directory entry and change the length from 2 (which was the length of "xx") to your actual OME-XML string length, and change the _value_ field to an _offset_
to the previous file length (since that is now the byte offset of the OME-XML string due to the append).<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">I pasted the C++ code we use in WiscScan to do this. Find it here:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <a href="https://gist.github.com/ctrueden/6a91656fa9804d1a874a" target="_blank">https://gist.github.com/ctrueden/6a91656fa9804d1a874a</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(In general that project is closed-source, so I cannot link you to the repository proper, unfortunately.)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
<div>
<p class="MsoNormal">We also have Java code in Bio-Formats that does this, which you could study:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <a href="https://github.com/openmicroscopy/bioformats/blob/v5.1.0-m4/components/formats-bsd/src/loci/formats/tiff/TiffSaver.java#L736-L866" target="_blank">
https://github.com/openmicroscopy/bioformats/blob/v5.1.0-m4/components/formats-bsd/src/loci/formats/tiff/TiffSaver.java#L736-L866</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">That code is actually a little more sophisticated that what I described above, since it does not _always_ overwrite the comment, depending on a few factors. But the overall approach is the same.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">One other thing: be careful of TIFF files over 4GB. Those need to be written a little differently, as BigTIFF, which uses 64-bit offsets. The libtiff library _does_ currently handle this properly, but the code I linked here would need to
change to handle that case, too.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">> For 64bit, I cannot find them, and I am not familiar (and don't have<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">> the infractructure set up) for makefile processing. Might you have a<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">> libtiff for 64bit to send me or a link?<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Here is an SO question someone asked about that, with a self-answer using Visual Studio 2008:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"> <a href="http://stackoverflow.com/q/13496980" target="_blank">
http://stackoverflow.com/q/13496980</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Maybe you could do something similar with a more recent version MSVS, assuming you are using that tool chain?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Regards,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Curtis<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">[1] <a href="https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf" target="_blank">
https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf</a><u></u><u></u></p>
</div>
</div>
<div>
<div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Thu, Mar 19, 2015 at 8:01 PM, Grabmayr, Heinrich <<a href="mailto:Heinrich.Grabmayr@ph.tum.de" target="_blank">Heinrich.Grabmayr@ph.tum.de</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Hi Curtis,<br>
<br>
Thanks very much for all these options. I think that 4) sounds most practicable for me now. Could you elaborate a bit on how you do the OmeXML injection into the completed tiff? And why can't the stub description be longer than 4 chars?<br>
Also, for my old project, I used the precompiled 32bit libtiff dll (I think I got it via GnuWin32). For 64bit, I cannot find them, and I am not familiar (and don't have the infractructure set up) for makefile processing. Might you have a libtiff for 64bit to
send me or a link?<br>
<br>
Thanks, Heinrich<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><br>
><br>
> > I am currently developing a microscope that is controlled by a LabView<br>
> > program and generates a massive amount of data output. As I like<br>
> > ome-tiff, I'd like to save my images in that format.<br>
><br>
> Your major options are:<br>
><br>
> 1) Wait for the native Bio-Formats C++ implementation [1], slated for OME<br>
> version 5.1 (and subject to change until 5.2).<br>
> - Pro: No more need for Java on the acquisition machine!<br>
> - Con: Non-trivial to build and deploy due to required dependencies.<br>
> - Con: Not actually ready yet. ;-)<br>
><br>
> 2) Use the Bio-Formats C++ bindings [2], available now.<br>
> - Pro: Provides access to the entire Bio-Formats API.<br>
> - Con: Non-trivial to build and deploy due to required dependencies.<br>
><br>
> 3) Use an interprocess solution such as:<br>
> - Subimager [3] -- used by CellProfiler<br>
> - A pipes-based bridge [4] -- used by ITK<br>
> - Pro: As fast as in-process solutions, with fewer dependencies.<br>
> - Con: Requires some coding to conform to your project's requirements.<br>
><br>
> 4) Write TIFF using libtiff, injecting your own OME-XML at the end. General<br>
> approach:<br>
><br>
> - Write a stub ImageDescription comment (four chars or less; e.g., "xx")<br>
> using libtiff.<br>
><br>
> - Generate your own OME-XML, maybe using a C++ XML library of your<br>
> choice.<br>
><br>
> - Inject the XML string by appending it to the TIFF (fast), then seeking to the<br>
> ImageDescription offset and length fields of the TIFF and updating them<br>
> accordingly (also fast).<br>
><br>
> - This approach avoids needing to rewrite the entire TIFF file just to add<br>
> OME-XML later. This is how we do it in WiscScan, although we do use the<br>
> Bio-Formats C++ bindings (see option 2 above) for actually building the<br>
> OME-XML string itself using the Bio-Formats MetadataStore API.<br>
><br>
> Further reading:<br>
> <a href="http://loci.wisc.edu/software/interfacing-non-java-code" target="_blank">
http://loci.wisc.edu/software/interfacing-non-java-code</a><br>
><br>
> Regards,<br>
> Curtis<br>
><br>
> [1] <a href="http://openmicroscopy.org/site/support/bio-" target="_blank">http://openmicroscopy.org/site/support/bio-</a><br>
> formats5.1/developers/cpp.html<br>
> [2] <a href="http://openmicroscopy.org/site/support/bio-formats5.0/developers/c-" target="_blank">
http://openmicroscopy.org/site/support/bio-formats5.0/developers/c-</a><br>
> bindings.html<br>
> [3] <a href="https://github.com/CellProfiler/subimager" target="_blank">https://github.com/CellProfiler/subimager</a><br>
> [4] <a href="https://github.com/scifio/scifio-itk-bridge" target="_blank">https://github.com/scifio/scifio-itk-bridge</a><u></u><u></u></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div></div></div>
</div>
</blockquote></div><br></div>