<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:#1F497D;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Hi Curtis<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thanks for this insight!<o:p></o:p></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.<o:p></o:p></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?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Cheers<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> Heinrich<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></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"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">[Resending to the actual ome-devel list, since that address got mangled in the reply chain before.]<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">> Could you elaborate a bit on how you do the OmeXML injection into the<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> completed tiff? And why can't the stub description be longer than 4<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> chars?<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></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.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></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).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">I pasted the C++ code we use in WiscScan to do this. Find it here:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <a href="https://gist.github.com/ctrueden/6a91656fa9804d1a874a" target="_blank">https://gist.github.com/ctrueden/6a91656fa9804d1a874a</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">(In general that project is closed-source, so I cannot link you to the repository proper, unfortunately.)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">We also have Java code in Bio-Formats that does this, which you could study:<o:p></o:p></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><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></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.<o:p></o:p></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.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> For 64bit, I cannot find them, and I am not familiar (and don't have<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">> the infractructure set up) for makefile processing. Might you have a<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> libtiff for 64bit to send me or a link?<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Here is an SO question someone asked about that, with a self-answer using Visual Studio 2008:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"> <a href="http://stackoverflow.com/q/13496980" target="_blank">
http://stackoverflow.com/q/13496980</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></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?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Curtis<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></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><o:p></o:p></p>
</div>
</div>
<div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></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:<o:p></o:p></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<o:p></o:p></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><o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>