{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "chem-bla-ics",
  "description": "Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.",
  "home_page_url": "https://chem-bla-ics.linkedchemistry.info/",
  "feed_url": "https://chem-bla-ics.linkedchemistry.info/2007/08/24/jchempaint-too-png-embedded.json",
  "icon": "https://chem-bla-ics.linkedchemistry.info/assets/images/chem-bla-ics_logo.png",
  "language": "en",
  "authors": [
    {
      "name": "Egon Willighagen",
      "url": "https://orcid.org/0000-0001-7542-0286",
      "_orcid": "0000-0001-7542-0286"
    }
  ],
  "items": [

    {
      "id": "https://doi.org/10.59350/rxpr6-t1772",
      "url": "https://chem-bla-ics.linkedchemistry.info/2007/08/24/jchempaint-too-png-embedded.html",
      "title": "JChemPaint too: PNG embedded connectivity tables",
      "content_html": "<p>Rich blogged about Firefly <a href=\"https://doi.org/10.59350/j026p-17z02\">embedding MDL molfiles in PNG images <i class=\"fa-solid fa-recycle fa-xs\"></i></a>,\nwhich I found <a href=\"https://doi.org/10.59350/wgy8j-brx45\">really <i class=\"fa-solid fa-recycle fa-xs\"></i></a> cool.\nRich and Noel later showed how that metadata <a href=\"https://doi.org/10.59350/wgy8j-brx45\">can be retrieved again <i class=\"fa-solid fa-recycle fa-xs\"></i></a>,\npossibly <a href=\"http://baoilleach.blogspot.com/2007/08/access-embedded-molecular-information.html\">with Python</a>.</p>\n\n<p>But I did not like that <a href=\"http://depth-first.com/articles/tag/firefly\">Firefly</a> could do this, and <a href=\"http://www.mdpi.org/molecules/html/50100093.htm\">JChemPaint</a> not.\nSo, I started hacking. First I discovered I had to get rid of the use of <a href=\"http://java.sun.com/javase/technologies/desktop/media/jai/\">JAI</a>; then I had to adapt the\nJChemPaintPanel <code class=\"language-plaintext highlighter-rouge\">takeSnaphot()</code> API to return a <code class=\"language-plaintext highlighter-rouge\">RendererImage</code>; and finally, I had to figure out how to write the extra metadata. Now, Firefly is not opensource\n(yet), so it took me some time to figure out how that was done, and this is how:</p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nc\">ImageWriter</span> <span class=\"n\">writer</span> <span class=\"o\">=</span> <span class=\"nc\">ImageIO</span><span class=\"o\">.</span><span class=\"na\">getImageWriters</span><span class=\"o\">(</span>\n  <span class=\"k\">new</span> <span class=\"nf\">ImageTypeSpecifier</span><span class=\"o\">(</span><span class=\"n\">awtImage</span><span class=\"o\">),</span> <span class=\"s\">\"png\"</span>\n<span class=\"o\">).</span><span class=\"na\">next</span><span class=\"o\">();</span>\n<span class=\"nc\">ImageTypeSpecifier</span> <span class=\"n\">specifier</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">ImageTypeSpecifier</span><span class=\"o\">(</span><span class=\"n\">awtImage</span><span class=\"o\">);</span>\n<span class=\"nc\">IIOMetadata</span> <span class=\"n\">meta</span> <span class=\"o\">=</span> <span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"na\">getDefaultImageMetadata</span><span class=\"o\">(</span> <span class=\"n\">specifier</span><span class=\"o\">,</span> <span class=\"kc\">null</span> <span class=\"o\">);</span>\n\n<span class=\"nc\">Node</span> <span class=\"n\">node</span> <span class=\"o\">=</span> <span class=\"n\">meta</span><span class=\"o\">.</span><span class=\"na\">getAsTree</span><span class=\"o\">(</span> <span class=\"s\">\"javax_imageio_png_1.0\"</span> <span class=\"o\">);</span>\n<span class=\"nc\">IIOMetadataNode</span> <span class=\"n\">tExtNode</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">IIOMetadataNode</span><span class=\"o\">(</span><span class=\"s\">\"tEXt\"</span><span class=\"o\">);</span>\n<span class=\"nc\">IIOMetadataNode</span> <span class=\"n\">tExtEntryNode</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">IIOMetadataNode</span><span class=\"o\">(</span><span class=\"s\">\"tEXtEntry\"</span><span class=\"o\">);</span>\n<span class=\"n\">tExtEntryNode</span><span class=\"o\">.</span><span class=\"na\">setAttribute</span><span class=\"o\">(</span> <span class=\"s\">\"keyword\"</span><span class=\"o\">,</span> <span class=\"s\">\"molfile\"</span> <span class=\"o\">);</span>\n<span class=\"n\">tExtEntryNode</span><span class=\"o\">.</span><span class=\"na\">setAttribute</span><span class=\"o\">(</span> <span class=\"s\">\"value\"</span><span class=\"o\">,</span> <span class=\"n\">mdlMolfile</span><span class=\"o\">);</span>\n<span class=\"n\">tExtNode</span><span class=\"o\">.</span><span class=\"na\">appendChild</span><span class=\"o\">(</span><span class=\"n\">tExtEntryNode</span><span class=\"o\">);</span>\n<span class=\"n\">node</span><span class=\"o\">.</span><span class=\"na\">appendChild</span><span class=\"o\">(</span><span class=\"n\">tExtNode</span><span class=\"o\">);</span>\n<span class=\"n\">meta</span><span class=\"o\">.</span><span class=\"na\">mergeTree</span><span class=\"o\">(</span><span class=\"s\">\"javax_imageio_png_1.0\"</span><span class=\"o\">,</span> <span class=\"n\">node</span><span class=\"o\">);</span>\n<span class=\"nc\">ImageOutputStream</span> <span class=\"n\">ios</span> <span class=\"o\">=</span> <span class=\"nc\">ImageIO</span><span class=\"o\">.</span><span class=\"na\">createImageOutputStream</span><span class=\"o\">(</span>\n  <span class=\"k\">new</span> <span class=\"nf\">FileOutputStream</span><span class=\"o\">(</span><span class=\"n\">filename</span><span class=\"o\">)</span>\n<span class=\"o\">);</span>\n<span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"na\">setOutput</span><span class=\"o\">(</span><span class=\"n\">ios</span><span class=\"o\">);</span>\n<span class=\"n\">writer</span><span class=\"o\">.</span><span class=\"na\">write</span><span class=\"o\">(</span> <span class=\"n\">meta</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">IIOImage</span><span class=\"o\">(</span><span class=\"n\">awtImage</span><span class=\"o\">,</span> <span class=\"kc\">null</span><span class=\"o\">,</span> <span class=\"n\">meta</span><span class=\"o\">),</span> <span class=\"kc\">null</span> <span class=\"o\">);</span>\n</code></pre></div></div>\n\n<p>Now I can create my own test files for the <a href=\"http://neksa.blogspot.com/2007/08/strigi-now-extracts-chemical.html\">Strigi’s ability to extract chemical metadata from PNG images</a>.\nHere is the JChemPaint generator PNG image for <a href=\"http://en.wikipedia.org/wiki/Benzophenone\">benzophenone</a>:</p>\n\n<p><img src=\"/assets/images/mdlTest.png\" alt=\"\" /></p>\n\n<p>Another issue, unrelated to this patch, is that writing PNG images changes the location of the structure in the JChemPaint editor,\nand that the placing of the element symbol in image writing is seriously broken. But that will soon be solved with\n<a href=\"https://progz-jchem.blogspot.com/\">Niels’ new renderer</a>.</p>\n\n<p>The metadata looks like:</p>\n\n<p><img src=\"/assets/images/jcpPNGmolfile.png\" alt=\"\" /></p>\n\n<p>(Newlines are lost in the XML display.)</p>\n\n<p>JChemPaint does not yet write InChIs, and it also does not open PNG images for input yet (as Firefly does).</p>\n\n<h4>References</h4>\n<div class=\"csl-bib-body\">\n    <div class=\"csl-entry\">Apodaca, R. (2007). Never Draw the Same Molecule Twice: Image Metadata for Cheminformatics. In <i>Front Matter</i>. Front Matter. https://doi.org/10.59350/j026p-17z02 <a href=\"https://doi.org/10.59350/j026p-17z02\">CrossRef</a> <a href=\"https://qlever.scholia.wiki/doi/10.59350/j026p-17z02\">Scholia</a></div>\n    <div class=\"csl-entry\">Apodaca, R. (2007). Never Draw the Same Molecule Twice: Viewing Image Metadata. In <i>Front Matter</i>. Front Matter. https://doi.org/10.59350/wgy8j-brx45 <a href=\"https://doi.org/10.59350/wgy8j-brx45\">CrossRef</a> <a href=\"https://qlever.scholia.wiki/doi/10.59350/wgy8j-brx45\">Scholia</a></div>\n  </div>",
      "summary": "Rich blogged about Firefly embedding MDL molfiles in PNG images , which I found really cool. Rich and Noel later showed how that metadata can be retrieved again , possibly with Python.",
      "image": "https://chem-bla-ics.linkedchemistry.info/assets/images/jcpPNGmolfile.png",
      "date_published": "2007-08-24T00:00:00+00:00",
      "date_modified": "2025-02-08T00:00:00+00:00",
      "tags": ["jchempaint","cheminf"],
      "_references": [
        
          
          
            { "url": "https://doi.org/10.59350/j026p-17z02", "doi": "10.59350/j026p-17z02"
             }
            ,
          
        
          
          
            { "url": "https://doi.org/10.59350/wgy8j-brx45", "doi": "10.59350/wgy8j-brx45"
             }
            
          
        ],
      
      
      
      
      
      
        "authors": [ { "name": "Egon Willighagen", "url": "https://orcid.org/0000-0001-7542-0286" } ]
      
    }

  ]
}
