<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Phap Duong on Medium]]></title>
        <description><![CDATA[Stories by Phap Duong on Medium]]></description>
        <link>https://medium.com/@d2phap?source=rss-7e76d1910f11------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*s8OIFlSgbgCATCF0SBf-kg.png</url>
            <title>Stories by Phap Duong on Medium</title>
            <link>https://medium.com/@d2phap?source=rss-7e76d1910f11------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 10 Jun 2026 16:04:02 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@d2phap/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The road to ImageGlass 9]]></title>
            <link>https://d2phap.medium.com/the-road-to-imageglass-9-7f251a98feea?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/7f251a98feea</guid>
            <category><![CDATA[dotnet]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[photography]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Sat, 02 Nov 2024 07:37:27 GMT</pubDate>
            <atom:updated>2024-11-02T07:39:07.375Z</atom:updated>
            <content:encoded><![CDATA[<p>Here I am, returning after 4 years, and so much has happened. Today, I will share how ImageGlass 9 came to be.</p><p>As you may know, ImageGlass 9 has been built from the ground up. In any photo-viewing app, the viewer component is the heart of the experience. The design might not be perfect, and button sizes may vary, but the main viewer — where users view and interact with their photos — needs to be smooth, responsive, and fast. I began developing version 9 by experimenting with various approaches to find the one that best matched my needs and skills.</p><h3>From the experiments…</h3><p>In Dec 2017, I started the “<a href="https://github.com/ImageGlass/electronjs-experiment">ImageGlass-Photos</a>” project, hoping to create a cross-platform version of ImageGlass. It featured a sleek UI inspired by the Windows 10 Fluent Design language, but the project didn’t get far due to poor performance and high memory usage.</p><figure><img alt="The “ImageGlass-Photos” project" src="https://cdn-images-1.medium.com/max/1024/1*XiZ65mSf3kEl8TrR1zpl6w.gif" /><figcaption>The “ImageGlass-Photos” project</figcaption></figure><p>In mid-2020, the “<a href="https://github.com/d2phap/ImageGlass-Preview">ImageGlass Preview</a>” project was born, trying the latest technology of Windows: UWP. Eventually, it ended up being abandoned due to the limitations and restrictions of UWP framework. A simple task such as opening a file picker dialog also required way more effort than with WinForms. I was lost — what happened to Windows native app development? Should I stick with the outdated WinForms or WPF, or struggle through the limitations of UWP?</p><figure><img alt="The “ImageGlass Preview” project" src="https://cdn-images-1.medium.com/max/1024/0*7wq-9NWmBqckHy6K" /><figcaption>The “ImageGlass Preview” project</figcaption></figure><p>Around the same time in mid-2020, I decided to experiment with the WPF framework for the “ImageGlass α” project, using Ashley Davis’s “<a href="https://www.codeproject.com/Articles/85603/A-WPF-custom-control-for-zooming-and-panning">ZoomAndPanControl</a>” code as a foundation. The app looked smooth and beautiful, but the control lacked UI virtualization, making it sluggish when opening large photos. Additionally, the WPF app was slow to launch and consumed a lot of memory. Once again, the experiment ended in disappointment.</p><figure><img alt="The “ImageGlass α” project" src="https://cdn-images-1.medium.com/max/1024/0*8tzt1piwR7wh7OMv" /><figcaption>The “ImageGlass α” project</figcaption></figure><p>In July 2021, with .NET 5 supporting WinForms and WebView2 gaining popularity, I kicked off a new project called “<a href="https://github.com/d2phap/HapplaBox">HapplaBox</a>” — a hybrid application combining C# WinForms with web technology. This app utilized C# libraries from the “ImageGlass α” project, the Thumbnail component from “<a href="https://github.com/ImageGlass/electronjs-experiment">ImageGlass-Photos</a>”, and a new JavaScript viewer component. It worked well initially until a communication issue arose between WebView2 and the C# backend code, leading to yet another abandonment of the project.</p><figure><img alt="The “HapplaBox” project" src="https://cdn-images-1.medium.com/max/820/0*i_CLVPyko7HHZ5qC" /><figcaption>The “HapplaBox” project</figcaption></figure><p>Not giving up, I continued researching zoom and pan algorithms for the viewer component, determined to develop my own native solution. I came across Mohammed Abd Alla’s article, “<a href="https://www.codeproject.com/Articles/17538/A-Picture-Viewer-Class-that-can-Scroll-and-Zoom-us">A Picture Viewer Class that can Scroll and Zoom using API</a>”, which offered a basic implementation of zoom and pan that worked surprisingly well. I successfully created a quick native GDI-based viewer component. However, when I tried to add support for transparency and animation, I ran into significant challenges due to the outdated GDI APIs. As a result, the viewer component remained just a proof of concept.</p><h3>… to the release of ImageGlass 9 Beta 1</h3><p>While exploring the DirectX domain, I discovered that Direct2D offered the native hardware acceleration I needed but using it with C# wasn’t straightforward. I found the “<a href="https://github.com/jingwood/d2dlib">d2dlib</a>” project, a .NET library for Direct2D rendering, and quickly ported my GDI code to work with it. I then developed more advanced features, including smooth zoom and pan, text rendering, and custom controls. I incorporated the image backend library from the “HapplaBox” project and created a new toolbar and menu component. It all worked wonderfully — until I started adding more image features: the limitations of the Direct2D APIs provided through “d2dlib” meant that I couldn’t implement transparency and animation effectively. Despite these setbacks, I remained optimistic about this approach and decided to publish it, leading to the birth of <a href="https://github.com/d2phap/ImageGlass/releases/tag/9.0.1.514">ImageGlass 9 Beta 1</a> in May 2022.</p><figure><img alt="ImageGlass 9 Beta 1" src="https://cdn-images-1.medium.com/max/1024/1*T-Cu0WyNRcB1eo0bwK2ANQ.png" /><figcaption>ImageGlass 9 Beta 1</figcaption></figure><h3>… and the stable foundation of ImageGlass 9 — ImageGlass 9 Beta 2!</h3><p>Unhappy with the limitations of the “d2dlib” library, I delved into its C++ source code to try to expose more features from Direct2D. However, my limited knowledge of C++ made it challenging. I continued searching for alternatives and came across the “<a href="https://github.com/smourier/WicNet">WicNet</a>” and “<a href="https://github.com/smourier/DirectN">DirectN</a>” projects. These were exactly what I needed! They provided direct interop APIs for Direct2D without the need to create new ones. This meant I could seamlessly port the Direct2D C++ APIs to C#. Additionally, they supported the latest features of Direct2D, allowing me to easily develop and take ownership of the technology.</p><p>I created the “<a href="https://github.com/d2phap/DXControl">D2Phap.DXControl</a>” library — a WinForms hybrid control that supports both Direct2D and GDI+ drawing, serving as the foundation for the Direct2D component used in ImageGlass. I replaced the viewer component based on “d2dlib” with a new one built on “D2Phap.DXControl”, successfully resolving all outstanding issues.</p><p>In Sep 2022 — 4 months after the Beta 1, <a href="https://github.com/d2phap/ImageGlass/releases/tag/9.0.2.904">ImageGlass 9 Beta 2</a> was released!</p><figure><img alt="ImageGlass 9 Beta 2" src="https://cdn-images-1.medium.com/max/1024/1*y8Fo1t1WqzbNB5p1E28FAw.png" /><figcaption>ImageGlass 9 Beta 2</figcaption></figure><h3>… to the final ImageGlass 9</h3><p>Building on the success of the viewer component, more features were added.</p><ul><li><a href="https://github.com/d2phap/ImageGlass/releases/tag/9.0.3.1225">Beta 3</a> was a significant release, introducing a new Crop tool and focusing on modernizing the app’s appearance. Implementing support for Windows 10 and 11 backdrop styles, such as Acrylic, Mica, and Mica Alt within the WinForms framework proved to be quite a challenge. I plan to write another blog post to share more details about this process.</li><li><a href="https://github.com/d2phap/ImageGlass/releases/tag/9.0.4.416">Beta 4</a> brought more features from ImageGlass 8, including support for layout customization and external tools. This release introduced the “<a href="https://github.com/ImageGlass/ImageGlass.Tools">ImageGlass.Tools</a>” library for developers looking to integrate their applications with ImageGlass, which led to the creation of the “<a href="https://github.com/d2phap/ExifGlass">ExifGlass</a>” app — an EXIF metadata viewing tool.</li><li><a href="https://github.com/d2phap/ImageGlass/releases/tag/9.0.5.726">Beta 5</a> marked a significant milestone with the integration of the web viewer component from the “HapplaBox” project, enabling seamless SVG viewing. Its core JavaScript library was split off into a separate project called “<a href="https://github.com/d2phap/happlajs">happlajs</a>”.</li><li><a href="https://github.com/d2phap/ImageGlass/releases/tag/9.0.6.1008">RC (Release Candidate)</a> helped bridge the gap between ImageGlass 8 and the new features introduced in ImageGlass 9.</li></ul><p>From the initial experiment to the GA release of ImageGlass, it took five years — a long journey for any indie open-source developer. Without the encouragement and support from ImageGlass users, especially those who donated, I might not have completed the revamp. ImageGlass 9 opens up a new path for its future development.</p><p>Stay tuned for more posts to come!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7f251a98feea" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[View and export Exif data in ImageGlass 7.7]]></title>
            <link>https://d2phap.medium.com/view-and-export-exif-data-in-imageglass-7-7-3542a297f0b5?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/3542a297f0b5</guid>
            <category><![CDATA[exiftool]]></category>
            <category><![CDATA[open-source-software]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[photography]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Thu, 01 Oct 2020 16:17:55 GMT</pubDate>
            <atom:updated>2020-12-02T09:32:13.124Z</atom:updated>
            <content:encoded><![CDATA[<h3>View and export Exif data in ImageGlass 8.0</h3><p>The next version of <a href="https://imageglass.org/">ImageGlass</a> is v8.0, and one of the most exciting features is Exif tool. This new tool helps you view Exif metadata of the viewing image, copy selected value, and export all data to text file. Currently, Exif tool is now available for testing in <a href="https://imageglass.org/moon">ImageGlass Moon</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4GVlpADDsUUa5ksf" /><figcaption>The new Exif tool in ImageGlass 7.7</figcaption></figure><p><strong>Exif tool</strong> of ImageGlass is actually an external application, <a href="https://exiftool.org/">https://exiftool.org/</a>, developed by Phil Harvey. To use it, you need ImageGlass 7.7, or the latest build of <a href="https://imageglass.org/moon">ImageGlass Moon</a>. Even though the <strong>Exif tool by Phil Harvey</strong> supports reading, writing and editing meta information, but ImageGlass 7.7 only supports reading at the moment. I will consider to extend it according to user’s requests.</p><h3>Configure Exif tool</h3><p>You can download the <strong>Windows executable</strong> version at <a href="https://exiftool.org/">https://exiftool.org/</a>, unzip and rename <strong>exiftool(-k).exe</strong> to <strong>exiftool.exe</strong> , place this file in a folder. It’s recommended to keep this file in <a href="https://imageglass.org/docs/app-configs">Configuration folder</a> of ImageGlass.</p><p>Then, you need to tell ImageGlass where the <strong>exiftool.exe</strong> is by locating this file in <strong>Settings &gt; Tools &gt; Exif tool</strong>, click on <strong>Select Exif tool file</strong> link button as the below screenshot.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X2o0U4OS7a8Nz9Xf0UfRpA.png" /></figure><p>An error message will come up if ImageGlass cannot access to the file, or it is not a valid Exif tool file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1013/1*7mjaJIBgLZfJk377MjTLsw.png" /><figcaption>Error message</figcaption></figure><h3>View and export Exif metadata</h3><p>You can open this tool by <strong>Main menu &gt; Tools &gt; Exif tool</strong>, or shortcut <strong>X</strong>. ImageGlass will execute <strong>exiftool.exe</strong> file, read the output, and display it into a list with nice groups.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1buF94M8W1Ra0sFDxRps0Q.png" /><figcaption>Exif tool in ImageGlass 7.7</figcaption></figure><ul><li><strong>To copy a row</strong>, you firstly need to select it, and either click on <strong>Copy value</strong> button or press <strong>Ctrl+C</strong>.</li><li><strong>To export all data to text file</strong>, you can click on <strong>Export…</strong> button, and select where to save it. The below screenshot is how the exported Exif metadata looks like:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JFyfngX_iT9oQkj0y7cajg.png" /></figure><ul><li>Exif tool automatically refreshes the Exif metadata list when you reload or navigate to next image.</li></ul><p>ImageGlass is continuing to get improved and added new useful tools / features. You can provide feedback, or report an issue at <a href="https://github.com/d2phap/ImageGlass/issues">https://github.com/d2phap/ImageGlass/issues</a>.</p><p>Happy Mid-Autumn festival!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3542a297f0b5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ImageGlass Preview and the future of ImageGlass]]></title>
            <link>https://d2phap.medium.com/imageglass-preview-and-the-future-of-imageglass-82f04fa768ed?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/82f04fa768ed</guid>
            <category><![CDATA[photography]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[roadmaps]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[imageglass]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Wed, 29 Jul 2020 17:01:08 GMT</pubDate>
            <atom:updated>2020-07-29T17:01:08.106Z</atom:updated>
            <content:encoded><![CDATA[<p>As the early announcement on my <a href="https://www.patreon.com/posts/new-imageglass-39518578"><strong>Patreon page</strong></a>, I have started a new ImageGlass app which called <a href="https://github.com/d2phap/ImageGlass-Preview"><strong>ImageGlass Preview</strong></a>. Since then, I have received lots of questions about the difference between 2 apps, and the future of <a href="https://imageglass.org/">ImageGlass</a>. To clarify the concerns (which I didn’t have time to do it), I will explain the roadmap of <a href="https://imageglass.org/">ImageGlass </a>in this blogpost.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-26STs0SvGO4fF2ABXk6Yg.png" /></figure><h3>First,</h3><h4>ImageGlass and ImageGlass Preview are two different apps.</h4><p>Don’t let the naming confuses you, they are actually two different apps for different purposes, different users, and <em>not to replace each other</em>.</p><ul><li><a href="https://github.com/d2phap/ImageGlass"><strong>ImageGlass</strong></a><strong> </strong>is a lightweight, versatile image viewer, written in C# WinForms using .NET Framework, supports Windows 7 SP1 or later. The latest version is 7.6.</li><li><a href="https://github.com/d2phap/ImageGlass-Preview"><strong>ImageGlass Preview</strong></a> is a modern, versatile image viewer, written in C#, using Universal Windows Platform (UWP), only supports Windows 10. It is still under development, and there is no public release yet.</li></ul><blockquote><strong><em>To get updates about ImageGlass projects, you can follow:</em></strong></blockquote><blockquote><em>👨‍💻</em> Github: <a href="https://github.com/d2phap/ImageGlass-Preview">https://github.com/d2phap/ImageGlass-Preview</a><br> <em>💰</em> Patreon: <a href="https://patreon.com/d2phap">https://patreon.com/d2phap</a><br> <em>🐦</em> Twitter: <a href="https://twitter.com/duongdieuphap">@duongdieuphap</a><br> <em>📸</em> Instagram: <a href="http://instagram.com/imageglassapp">@ImageGlassApp</a></blockquote><h3>Second,</h3><h4>The limitations of ImageGlass</h4><p>If you follow <a href="https://github.com/d2phap/ImageGlass">ImageGlass’s Github</a>, you can see some issues about performance which cannot (or is very hard to) resolve. It’s about hardware acceleration, and slowness of startup time.</p><p>ImageGlass uses WinForms UI framework which born in 2002, 18 years ago. WinForms’ controls are rendered using GDI+, and GDI+ itself is <a href="https://en.wikipedia.org/wiki/Graphics_Device_Interface#Windows_XP">not hardware acceleration</a>.</p><p>Another common topic about ImageGlass is its startup time slowness. This is typical of .NET Framework applications; even though, there are some tricks to optimize it. The slowness often happens in the first time you run .NET app after starting PC because .NET Runtime will compile the codes and load into memory. However, it’s much faster when you run from the second time.</p><p>Due to these two limitations, lots of awesome ideas about a fancy, beautiful UI were rejected.</p><h3>Third,</h3><h4>Goals of ImageGlass Preview</h4><p>ImageGlass Preview uses <a href="https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide">UWP platform</a> which is the latest cutting-edge technology of Microsoft. The apps built with UWP has the beautiful Fluent design system, flexible layout, transition, and great performance.</p><p>ImageGlass Preview is designed for high DPI devices, works great on touch screens and trackpad gestures. It focuses on viewing functions with a beautiful, modern UI, and convenient UX. It loads image fast, responsive, and able to display big image files.</p><h3>Roadmap</h3><p>ImageGlass continues to receive updates and new features, version 8.0 will be releases in 2021 and use .NET 5.0 runtime, while ImageGlass Preview is progressively developed with the basic features of ImageGlass.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rVaROmBKtxkbD3V205MDSg.png" /></figure><h4>For ImageGlass:</h4><ul><li>v7.x will be small updates; mostly contains bug fixes, improvements, and some small features.</li><li>v8.0 will contain breaking changes as it will use .<a href="https://devblogs.microsoft.com/dotnet/introducing-net-5/">NET 5</a>. New features are also expected to introduce.</li><li>v8.x will be small updates, bug fixes.</li></ul><h4>For ImageGlass Preview:</h4><ul><li>v0.1 will be the first public alpha release, for those who want to try it. There will be probably 5 alpha versions from v0.1 to v0.5 to collect feedback from the early adopters.<br>Basic features could be: Zoom modes, Thumbnail viewing, Full screen, Slideshow, Window fit, Frameless,…</li><li>v0.6 will be the first public beta release. More features will be added: File manipulations (Copy, cut, delete,…), Color picker, Cropping, External editing app, Theming, Localization, Image frames/pages extraction…</li><li>v1.0 is expected to have most of features of ImageGlass v4.0.</li></ul><h3>FAQs</h3><ol><li><strong>Is ImageGlass WinForms dead?</strong><br><em>No, I will still maintain, fix bugs, add new features as usual. But the release may take longer, or with smaller updates.</em></li><li><strong>What features will ImageGlass Preview focus on?</strong><br>It will progressively have basic features of ImageGlass: Zoom modes, Windows modes,… and more customizable layout, keyboard shortcuts…</li><li><strong>Is ImageGlass Preview to replace the current ImageGlass?</strong><br><em>No, both two apps will live together, for different purposes, different users.</em></li><li><strong>Is ImageGlass Preview being planned for a commercial product in the future?</strong><br><em>No, it will be free (literally, no need to pay, no in-app ad) and open source as same as the current ImageGlass.</em></li><li><strong>Can I install and run both two apps in a same PC?</strong><br><em>Yes, you can. It has different name, and uses different protocol,… ImageGlass Preview should be installed from Store. For more details, I will talk about it in a separated post.</em></li></ol><p>If you have any questions or suggestions, please don’t hesitate to reach me out</p><blockquote><em>👨‍💻</em> Github: <a href="https://github.com/d2phap/ImageGlass-Preview">https://github.com/d2phap/ImageGlass-Preview</a><br> <em>💰</em> Patreon: <a href="https://patreon.com/d2phap">https://patreon.com/d2phap</a><br> <em>🐦</em> Twitter: <a href="https://twitter.com/duongdieuphap">@duongdieuphap</a><br> <em>📸</em> Instagram: <a href="http://instagram.com/imageglassapp">@ImageGlassApp</a></blockquote><p>Thanks!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=82f04fa768ed" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Corda Automation Testing with Nightwatch.js and CircleCI]]></title>
            <link>https://d2phap.medium.com/corda-automation-testing-with-nightwatch-js-and-circleci-8a907ada6a38?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/8a907ada6a38</guid>
            <category><![CDATA[circleci]]></category>
            <category><![CDATA[automation-testing]]></category>
            <category><![CDATA[nightwatch]]></category>
            <category><![CDATA[corda]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Tue, 14 Apr 2020 06:49:22 GMT</pubDate>
            <atom:updated>2020-04-14T06:49:22.567Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*RwNkQKdhs58mno6G.png" /><figcaption>Corda Automation Testing with Nightwatch.js and CircleCI</figcaption></figure><p>I was researching a way how to test our new supported blockchain protocol — Corda on Chainstack platform. Also, this is my first-ever blockchain blogpost. I will share how I carried out end-to-end continuous Corda integration with <strong>Nightwatch.js</strong> and <strong>CircleCI</strong>.</p><blockquote><em>🍄 </em>Originally published on January 7, 2020 at <a href="https://chainstack.com/corda-automation-testing-with-nightwatch-js-and-circleci/">https://chainstack.com/corda-automation-testing-with-nightwatch-js-and-circleci/</a></blockquote><p>The code in<em> </em>Corda is written using Kotlin, a programming language from JetBrains, and Nightwatch.js is a Node.js powered end-to-end testing framework. My challenges are to connect to a node, initiate a flow, and have it signed by relevant parties using JavaScript.</p><p>I have a few ideas to do this:</p><ul><li>Run a Corda web server in my Docker image, and write JavaScript to interact to the CorDapp.</li><li>Set up GraalVM (a high-performance polyglot VM) in my Docker image, write a Java function in Nightwatch.js.</li><li><strong>Interact with Corda Standalone Shell client by executing shell script in Node.js, then verify the output of shell script</strong>.</li></ul><p>The first two ideas seem possible, but I need to include CorDapp source code in the test, which is non-optimal and inconvenient. Eventually, the last one is better and simpler.</p><p>I use <a href="https://docs.chainstack.com/tutorials/no-ticket-scalping-cordapp-on-corda">No ticket scalping CorDapp</a> for my test. You may want to explore it before moving to details.</p><h3>Technology stack</h3><p>These are the details of programming languages, tools, and frameworks I used in the test:</p><ul><li>Nightwatch.js 1.3.2 / Node.js 11 / shell script;</li><li>Docker;</li><li>CircleCI 2.0;</li><li>OpenJDK-8;</li><li><a href="https://software.r3.com/artifactory/corda-releases/net/corda/corda-tools-shell-cli/4.3/">Corda Standalone Shell client 4.3</a>;</li><li><a href="https://github.com/chainstack/no-ticket-scalping-cordapp/releases">No ticket scalping CorDapp</a> installed on two Corda nodes, running on <a href="https://chainstack.com/">Chainstack</a>.</li></ul><p>I assume that you are familiar with the Nightwatch.js framework, so I won’t focus on the structure as well as the test case code.</p><p>Besides the Corda Standalone Shell client, Chainstack also provides <a href="https://github.com/chainstack/corda-shell-docker">Chainstack standalone shell</a>, which is a containerized version of Corda Standalone Shell, and which helps you interact with the CorDapps. You can learn more about it in our <a href="https://docs.chainstack.com/operations/corda/tools#corda-standalone-shell">official documentation</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pNihfajiZ7exebptLBBuRg.png" /><figcaption>Node details and credentials in Chainstack.</figcaption></figure><h3>Install OpenJDK-8 in Docker image</h3><p>You need to install <strong>OpenJDK-8</strong> to run Corda Standalone Shell client; add these lines into your Docker file.</p><pre># Install OpenJDK-8<br>RUN apt-get update &amp;&amp; \<br>    apt-get install -y openjdk-8-jdk &amp;&amp; \<br>    apt-get install -y ant &amp;&amp; \<br>    apt-get clean;</pre><pre># Fix certificate issues<br>RUN apt-get update &amp;&amp; \<br>    apt-get install ca-certificates-java &amp;&amp; \<br>    apt-get clean &amp;&amp; \<br>    update-ca-certificates -f;</pre><pre># Setup JAVA_HOME -- useful for docker commandline<br>ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/<br>RUN export JAVA_HOME</pre><p>You may need to build your Docker image again.</p><pre>docker build .</pre><h3>Write shell script to interact with No ticket scalping CorDapp</h3><p>You can learn the prerequisites to run Corda Standalone Shell client at: <a href="https://docs.chainstack.com/operations/corda/tools#corda-standalone-shell">https://docs.chainstack.com/operations/corda/tools#corda-standalone-shell</a></p><p>The below script will do the following things:</p><ul><li>Connect to Corda <strong>Node 1</strong>.</li><li>Print out all flows in <strong>Node 1</strong>.</li><li>Start noScalpFlow flow to distribute <strong>99</strong> tickets of event <strong>Chainstack live concert</strong> from <strong>Node 1</strong> to <strong>Node 2</strong>.</li><li>Verify the transaction by executing vaultQuery command.</li><li>Exit the Corda Standalone Shell client.</li></ul><pre># location of binary files<br>CORDA_CLI=&quot;corda-tools-shell-cli-4.3-all.jar&quot;<br>CORDAPP_DIR=&quot;../my-cordapps/&quot;</pre><pre># node 1 credentials<br>NODE1_HOST=&quot;nd-255-728-694.rg-837-380.int.chainstack.com&quot;<br>NODE1_PORT=&quot;10201&quot;<br>NODE1_USER=&quot;vibrant_ptolemy&quot;<br>NODE1_PASS=&quot;*****&quot;</pre><pre># node 2 legal name<br>NODE2_LEGALNAME=&quot;OU=Chainstack-ND-026-270-261, O=Chainstack, L=Singapore, C=SG&quot;</pre><pre># command to connect to Corda node 1<br>START_CORDAPP=&quot;java -jar $CORDA_CLI --host=$NODE1_HOST --port=$NODE1_PORT --user=$NODE1_USER --password=$NODE1_PASS --cordapp-directory=$CORDAPP_DIR&quot;</pre><pre># launch the Corda Standalone Shell client and run flow commands<br>{<br>  echo &quot;flow list&quot;<br>  echo &quot;start noScalpFlow eventName: &#39;Chainstack live concert&#39;, ticketQuantity: 99, toDistributor: &#39;$NODE2_LEGALNAME&#39;&quot;<br>  echo &quot;run vaultQuery contractStateType: com.noScalpDapp.states.noScalpState&quot;<br>  echo &quot;bye&quot;<br>} | $START_CORDAPP</pre><p>Save as start_cordapp.sh file, and run it in terminal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LfwDoHZHp895P0MCI1gq2Q.png" /><figcaption>Interact with CorDapp in terminal.</figcaption></figure><p>Checking the output, there should be a transaction. You can use this information to verify whether the test passed or not.</p><pre>Flow completed with result: SignedTransaction(id=C98A2B49358B9FC6C1C8EEBAA99DF36238E9E4F97CF492905C2A1EF25B1B9639)</pre><h3>Execute the shell script by Node.js and verify the output</h3><p>In the below code, I write a function to start the noScalpFlow flow, print out, and verify its result. In Node.js, thechild_process module provides the ability to spawn child processes.</p><p>Then, I combine child_process.exe() and util.promisify() to create an async function which returns a boolean Promise.</p><pre>// Nodejs utils to execute shell script asynchronously<br>const { promisify } = require(&#39;util&#39;);<br>const exec = promisify(require(&#39;child_process&#39;).exec);<br></pre><pre>/**<br> * Run noScalpFlow flow and verify the result<br> * <a href="http://twitter.com/param">@param</a> {Object} node1 First node<br> * <a href="http://twitter.com/param">@param</a> {Object} node2 Second node<br> */<br>async function verifyFlow(node1, node2) {<br>  const CORDA_CLI = &#39;corda-tools-shell-cli-4.3-all.jar&#39;;<br>  const CORDAPP_DIR = &#39;../my-cordapps/&#39;;<br>  const START_CORDAPP = `java -jar ${CORDA_CLI} --host=${node1.host} --port=${node1.port} --user=${node1.user} --password=${node1.pass} --cordapp-directory=${CORDAPP_DIR}`;</pre><pre>  // launch the Corda Shell client and run flow commands<br>  const { stdout } = await exec(`<br>    START_CORDAPP=&quot;${START_CORDAPP}&quot;<br>    {<br>      echo &quot;flow list&quot;<br>      echo &quot;start noScalpFlow eventName: &#39;Chainstack live concert&#39;, ticketQuantity: 99, toDistributor: &#39;${node2.legalName}&#39;&quot;<br>      echo &quot;run vaultQuery contractStateType: com.noScalpDapp.states.noScalpState&quot;<br>      echo &quot;bye&quot;<br>    } | $START_CORDAPP<br>  `);</pre><pre>  // Print out the output<br>  console.log(stdout);</pre><pre>  // Verify the output<br>  return stdout.includes(&#39;Flow completed with result: SignedTransaction&#39;);<br>}</pre><p>After that, you need a test scenario using the Nightwatch.js framework.</p><pre>// Node 1 credentials<br>const node1 = {<br>  host: &#39;nd-255-728-694.rg-837-380.int.chainstack.com&#39;,<br>  port: &#39;10201&#39;,<br>  user: &#39;vibrant_ptolemy&#39;,<br>  pass: &#39;frisk-lapdog-uneasy-amid-slate-flaky&#39;,<br>};</pre><pre>// Node 2 legal name<br>const node2 = {<br>  legalName: &#39;OU=Chainstack-ND-026-270-261, O=Chainstack, L=Singapore, C=SG&#39;,<br>};</pre><pre>module.exports = {<br>  &#39;<a href="http://twitter.com/tags">@tags</a>&#39;: [&#39;runCorDappFlow&#39;],</pre><pre>  &#39;Run CorDapp flow&#39;(browser) {<br>    const { page } = browser;<br>    const corda = page.nodes.corda();</pre><pre>    // Run flow and verify result<br>    browser.perform(async () =&gt; {<br>      await corda.verifyFlow(node1, node2);<br>    });</pre><pre>    browser.end();<br>  },<br>};</pre><p>Commit your code and run the workflow in CircleCI; it will take a few minutes to complete. In my scenario, I get the credentials of <strong>Node 1</strong> and <strong>Node 2</strong>, run <strong>noScalpFlow</strong> flow, and verify the output. You can see results in the below screenshot.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s2Pm8zje1JUkCIDPAC3ArQ.png" /><figcaption>Running CorDapp flow in CircleCI.</figcaption></figure><p>Before writing this post, I have done a lot of researching works to find the best solution for Corda automation testing as most of the resources from the Internet focus on building CorDapps. I believe this post will help your team to test, speed up, and secure your Corda applications like what the Chainstack team is doing.</p><p>You can try Chainstack for free at: <a href="https://console.chainstack.com">https://console.chainstack.com</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8a907ada6a38" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understand ImageGlass config files]]></title>
            <link>https://d2phap.medium.com/understand-imageglass-config-files-73fd61d6ccfc?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/73fd61d6ccfc</guid>
            <category><![CDATA[photo-viewer]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[config-file]]></category>
            <category><![CDATA[photos]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Mon, 30 Mar 2020 08:45:02 GMT</pubDate>
            <atom:updated>2020-03-30T08:45:56.407Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="http://ageglass-7-5-68">ImageGlass 7.5</a> comes with the new Settings engine which provides lots of new features and improvements for both end-users and admins. If you are not familiar with ImageGlass configurations, you can see at <a href="https://imageglass.org/docs/app-configs">the official documentation site</a>. I am going to share you more details and how you can speed up your daily tasks with it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MFtBTB651FIEBV0y" /><figcaption>Photo by <a href="https://unsplash.com/@mariogogh?utm_source=medium&amp;utm_medium=referral">Mario Gogh</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3><strong>Config files</strong></h3><p>As you know, there are 3 different config files, which are loaded in the order:</p><ul><li>igconfig.default.xml, located in <em>Startup dir</em>, specifies the defaults which are used if no other settings are available at first start.</li><li>igconfig.xml, located in <em>Config dir</em>, contains all user settings, written by ImageGlass after closing. This overrules the settings in the igconfig.default.xml file.</li><li>igconfig.admin.xml, located in <em>Startup dir</em>, contains the settings which will overrule all settings in the files above.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/980/0*b2YLzO71eWXEizBJ.png" /><figcaption>ImageGlass config files</figcaption></figure><p>ImageGlass will look for every mentioned file, in the described order, and the locations. The configuration is built from zero, setting for setting, by using the following 4 steps:</p><ol><li>Take the default set by the developer.</li><li>If a igconfig.default.xml was found, and the settings can be found in there, it will override the values from step 1.</li><li>If a igconfig.xml was found, and the setting can be found in there, it will override the values from step 2.</li><li>If a igconfig.admin.xml was found, and the setting can be found in there, it will override the values from step 3.</li></ol><p>ImageGlass will use the resulting setting, and when every single setting in the complete configuration is processed, it will write the complete configuration to it’s igconfig.xml file (and only there).</p><h3>Admin user</h3><p>If you are admin of a network, and want to install ImageGlass with some default settings, and disable some as well, you can now do it easily with this new Settings engine.</p><ul><li>Set your default configs in igconfig.default.xml file, and the configs that you don’t want the user to change it in igconfig.admin.xml file,</li><li>Deploy both files to startup folder of ImageGlass where the ImageGlass.exe is located.</li></ul><h3>End user</h3><p>To end user, it’s easy for you to lock a setting using admin config file. Some examples:</p><ul><li>If you always want to open ImageGlass in maximized window, you can set it in igconfig.admin.xml file:<br>&lt;Item key=&quot;FrmMainWindowState&quot; value=&quot;Maximized&quot; /&gt;</li></ul><p>You can find all the setting keys in igconfig.xml file.</p><p>I have started developing the next version of <a href="https://imageglass.org/">ImageGlass</a>. One of the most-requested features is <strong>Cropping tool</strong> will be available soon.</p><p>Follow me <a href="https://twitter.com/duongdieuphap">@duongdieuphap</a>, and stay tuned!</p><h3>Dương Diệu Pháp on Twitter</h3><p>Lots of requests about Cropping tool for ImageGlass. Here is the first preview after a sleepless week. https://t.co/G5y1xeZrnU</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=73fd61d6ccfc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Experiment viewing multi-page TIF format!]]></title>
            <link>https://d2phap.medium.com/viewing-multi-page-tif-format-e0dcc256f4f0?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/e0dcc256f4f0</guid>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[tiff]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[photos]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Tue, 29 Oct 2019 13:44:14 GMT</pubDate>
            <atom:updated>2019-10-29T15:54:41.604Z</atom:updated>
            <content:encoded><![CDATA[<p>Yay! I have been working on supporting multi-page image formats in the past few months, including TIFF, GIF, ICO, WEBP,… and finally there were some results!</p><p>If you are following <a href="https://github.com/d2phap/ImageGlass/issues/238">this topic</a>, you may see my updates recently. For those who are not, this article talks about the development version of <a href="https://imageglass.org/">ImageGlass</a> (called <a href="https://imageglass.org/moon">ImageGlass Moon</a>), so if you are using stable version v7.0.7.26, you cannot experiment it.</p><h3><em>❤</em></h3><blockquote>By the way, I have got my <a href="https://github.com/sponsors/d2phap"><strong>Github Sponsor profile</strong></a>:<br><a href="https://github.com/sponsors/d2phap"><strong>https://github.com/sponsors/d2phap</strong></a></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DmiFLSqORuPtYkBx08GpzQ.png" /><figcaption>Become a sponsor on Github Sponsors</figcaption></figure><blockquote><strong>You can become a sponsor with only $1/month</strong>. It will be a great encouragement to me that I can spend more time in developing ImageGlass (and other open source projects).</blockquote><h3>Page navigation tool</h3><p>The idea was to provide user to navigate the pages of the viewing image file through buttons and shortcuts. The buttons are handy if the user is using mouse or touch screen while the shortcuts are helpful for keyboard users.</p><p>In the latest version of ImageGlass Moon, you can see a new tool called <strong><em>Page navigation tool</em> </strong>in <strong><em>Tools</em> </strong>menu. The UI is pretty simple with 4 buttons (from left to right):</p><ul><li>View the first page (Ctrl+Home)</li><li>View the previous page (Ctrl+Left arrow)</li><li>View the next page (Ctrl+Right arrow)</li><li>View the last page (Ctrl+End)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a-dMzCvEV-btxUh_wEfK5A.png" /><figcaption>Page navigation tool</figcaption></figure><p>I guess it’s quite easy to understand what the buttons do when you see their names. It’s similar to image file navigation, I try to provide the functions that help people quickly view image pages. You can combine Ctrl key with the current navigation keys: Left arrow, Right arrow, Home, End as its shortcuts.</p><p>This tool window behavior is same as <strong>Color picker</strong>, it means you can toggle, move it, it will follow the main window position. ImageGlass also remember your last choice: if you don’t close this tool window before exiting the app, ImageGlass will open it again in the next time.</p><h3>Pages extraction</h3><p>I did not create a new function but extended the <em>Extract image frames</em> menu of GIF format to support other multi-page formats. Moreover, this feature was upgraded and used Magick.NET library to extract all the pages gracefully.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/871/1*2sdJSHgnbmLU31Ul7aClKw.png" /></figure><p>You can access it via <strong><em>Main menu</em></strong> &gt; <strong><em>Image </em></strong>&gt; <strong><em>Extract image pages</em></strong> or context menu.</p><h3>View single GIF frame</h3><p>GIF is also a multi-page image format, with this implementation, you can view a frame separately.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RtoQa4brC4PPaBofyhdUAw.png" /></figure><p>Open a GIF file, and use navigation functions to manually move to next / previous frame. To resume the animation, you can click on the <strong><em>Start / Stop animating image </em></strong>context menu.</p><p>As this feature is still in ImageGlass Moon, I would like to hear your feedback. If you want to see the development progress, you can follow it at <a href="https://github.com/d2phap/ImageGlass/issues/238">https://github.com/d2phap/ImageGlass/issues/238</a>.</p><p>Thanks for reading!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0dcc256f4f0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Enable Windows File Explorer sort order in ImageGlass 7]]></title>
            <link>https://d2phap.medium.com/enable-windows-file-explorer-sort-order-in-imageglass-7-ff63b4ab16a0?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/ff63b4ab16a0</guid>
            <category><![CDATA[file-explorer]]></category>
            <category><![CDATA[photo-apps]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[sorting]]></category>
            <category><![CDATA[image-loading-and-caching]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Fri, 23 Aug 2019 15:20:28 GMT</pubDate>
            <atom:updated>2019-08-23T15:20:28.421Z</atom:updated>
            <content:encoded><![CDATA[<p>A frequently requested feature for <a href="https://imageglass.org/">ImageGlass</a> has been the ability to “follow the sort order of the Explorer window”. This is a feature folks are familiar with in Windows Photos. The ImageGlass team is happy to announce the <a href="https://imageglass.org/news/announcing-imageglass-7-0-67">ImageGlass 7.0</a> release has made progress with this feature request!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cbZodsh05AwQclE1zFn2IA.png" /><figcaption>Windows File Explorer</figcaption></figure><h3>How it works</h3><p>The Settings dialog has been enhanced with new capabilities under <strong>Image loading order</strong><em> </em>group:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/910/1*9T6kIiM59_kZ5DXXeb1wBg.png" /><figcaption>Follow Windows File Explorer sort order in ImageGlass</figcaption></figure><p>In addition to the original loading order options, you can now sort in ascending or descending order, or allow the Windows File Explorer order to take precedence. To enable it, you can select the “<strong>User Windows File Explorer sort order if possible</strong>” checkbox in <strong>Settings </strong>&gt; <strong>Image </strong>tab.</p><p>Being able to sort in descending order allows you to view images from oldest to newest, or smallest to largest, which you could not do in ImageGlass 6.</p><p>The Windows File Explorer order takes effect when you double-click an image to view in ImageGlass, or when you drag-and-drop an image into ImageGlass.</p><blockquote><strong><em>💡 Tip</em></strong><br>If the order of the folder changed, you can update the image list by pressing <strong>Ctrl+Shift+R</strong>, or open <strong>Main menu</strong> &gt; <strong>File </strong>&gt; <strong>Reload image list</strong>.</blockquote><h3>Limitations</h3><p>In ImageGlass 7, support for Explorer order is limited, as it is a translation of Explorer sorting to the existing ImageGlass sorting. This primarily means that sorting in Windows Explorer by <strong>metadata columns will have no effect</strong> in ImageGlass. Most available columns in Explorer are metadata columns, except the default <em>Name</em>, <em>Type</em>, <em>Size </em>and <em>Date modified</em>/<em>created</em>/<em>accessed </em>columns.</p><p>Moreover, the folder of the viewing images <strong>should remain to be opened</strong>. You can minimize it as long as you do not close or change other directory when ImageGlass first loads the image list.</p><p>This article is contributed by <a href="https://fire-eggs.github.io/">Kevin Routley</a> — ImageGlass’ collaborator.</p><p>In the next story, I will tell you all the unbelievable ways to work with files in ImageGlass!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ff63b4ab16a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Integrate ImageGlass 7 to your website using Web-to-App linking]]></title>
            <link>https://d2phap.medium.com/integrate-imageglass-7-to-your-website-using-web-to-app-linking-541b13daa318?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/541b13daa318</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[html]]></category>
            <category><![CDATA[web-to-app]]></category>
            <category><![CDATA[imageglass]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Thu, 01 Aug 2019 14:08:46 GMT</pubDate>
            <atom:updated>2019-08-01T14:08:46.408Z</atom:updated>
            <content:encoded><![CDATA[<p>A guy asked me a question that he had an internal web-based document scanning application and he wanted to view the scanned photos by ImageGlass on his web app. This was a challenging request and I almost wanted to reply him that it’s impossible! However, in a few seconds, I suddenly thought of Skype, this app somehow allows user to open chat window when they click on the username hyperlink. Another example is when using mailto: in href of hyperlink, it will trigger the default email app with the pre-filled email address. I spent few more hours to research and it’s done eventually.</p><p>In this post, I will teach you how to integrate <a href="https://imageglass.org/">ImageGlass 7</a> to your website with few simple lines of code.</p><h3>What is ImageGlass Web-to-App linking?</h3><p>A special protocol associates to ImageGlass app, allows user to launch ImageGlass with argument in order to view the local image files.</p><h3>The protocol syntax</h3><p><em>imageglass:[path]</em></p><ul><li><em>imageglass:</em> is the protocol, this helps to launch ImageGlass app.</li><li><em>[path]</em> is an optional argument to pass to ImageGlass app when it launches.</li></ul><h3>How to register the protocol?</h3><p>Web-to-App linking is also registered when you set ImageGlass as default photo viewer app. If you haven’t done it, you can open <strong>Settings</strong> dialog, go to <strong>File Associations</strong> tab, and click on <strong>Set as Default photo viewer</strong> button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mQM9jue-4urlgNe2Fd6lfw.png" /><figcaption>File Associations tab in Settings dialog</figcaption></figure><p>You also can do it by command line: <em>igtasks.exe reg-uri-scheme</em></p><p>To test the protocol, you can open web browser and type <em>imageglass:</em> to the address bar, it should open ImageGlass app. You can include a folder or image file path as well.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BRJ10hTTWrBj5BwlaqZHPw.png" /><figcaption>Open ImageGlass by protocol</figcaption></figure><blockquote><strong><em>💡 Tip<br></em></strong>ImageGlass also supports relative path!</blockquote><h3>Sample codes</h3><p>The sample code snippets below are to create 3 hyperlinks:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pquTKVyMcmR0s_fe8hATSw.png" /><figcaption>Sample code</figcaption></figure><h4>Open ImageGlass with blank window</h4><pre>&lt;a href=&quot;imageglass:&quot;&gt;<br>  Open ImageGlass with blank window<br>&lt;/a&gt;</pre><h4>Open an image file by ImageGlass</h4><pre>&lt;a href=&quot;imageglass:%UserProfile%\Downloads\sample.svg&quot;&gt;<br>  Open an image file by ImageGlass<br>&lt;/a&gt;</pre><h4>Open image files in Downloads folder by ImageGlass</h4><pre>&lt;a href=&quot;imageglass:%UserProfile%\Downloads&quot;&gt;<br>  Open image files in Downloads folder by ImageGlass<br>&lt;/a&gt;</pre><p>Most of users do not need this Web-to-App linking feature, but if you are IT administrator or web developer who want to develop an web-based application for your company network, I believe this is really useful to you.</p><p>If you have not updated to ImageGlass 7.0, you can always download it at <a href="https://imageglass.org/">https://imageglass.org</a>, and let me know your feedback by commenting below! 👇🏿</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=541b13daa318" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I’m renovating the core library of ImageGlass]]></title>
            <link>https://d2phap.medium.com/im-renovating-the-core-library-of-imageglass-e39aa26569bc?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/e39aa26569bc</guid>
            <category><![CDATA[image-processing]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[asyncawait]]></category>
            <category><![CDATA[csharp]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Mon, 13 May 2019 14:12:02 GMT</pubDate>
            <atom:updated>2019-05-13T14:18:52.673Z</atom:updated>
            <content:encoded><![CDATA[<p>I have been receiving many requests about supporting viewing multi-page for those image format like TIF, ICO,… but it’s tough to implement due to structure of the core library.</p><p>Besides Magick.NET, <a href="https://imageglass.org/">ImageGlass</a> uses variety of third-party libraries to load particular image formats, such as <a href="https://www.codeproject.com/Articles/16178/IconLib-Icons-Unfolded-MultiIcon-and-Windows-Vista">IconLib</a> for icon file, <a href="https://docs.microsoft.com/en-us/windows/desktop/wic/-wic-about-windows-imaging-codec">WIC</a> for RAW formats… This helps the app to be able support more file extensions, but also makes the core library messy and fragmented.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B4M5SqXShBqK_3j4GCa7_A.png" /><figcaption>ImageGlass Core library</figcaption></figure><p>After a month, I have completed the first stage of renovation, and introduced the new core library called <strong>ImageGlass.Heart</strong> which is already integrated to the latest version of ImageGlass Moon (v6.1.5.12).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P6cw0EBVP76mPPHaafMYaQ.png" /><figcaption>ImageGlass.Heart library</figcaption></figure><h3>So, what are the differences?</h3><ul><li><strong>ImageGlass.Heart</strong> supports C# asynchronous function that does not freeze the user interface while running.</li><li><strong>ImageGlass.Heart</strong> supports changing the number of maximum files can be cached in memory. <strong>ImageGlass.Core</strong> only supports 3 files.</li><li>In <strong>ImageGlass.Heart</strong>, ImageBooster is improved with better file position caching and resource releasing.</li><li>In <strong>ImageGlass.Heart</strong>, the loading functions are unified and easy to develop.</li></ul><h3>But…</h3><ul><li><strong>ImageGlass.Heart</strong> consumes a little bit more memory than <strong>ImageGlass.Core.</strong> But, it’s only about 3%. 😶</li></ul><p>And not over yet, with the above pros of <strong>ImageGlass.Heart</strong>, it’s quite promising to implement multi-page viewing feature for TIFF, ICO,.. format. In the stage 2, I may introduce “hard-disk caching” which I am currently still researching. 😚</p><p>If you want to try out <strong>ImageGlass.Heart</strong>, you can download ImageGlass Moon: <a href="https://imageglass.org/moon">https://imageglass.org/moon</a>, which has the latest of the new ImageGlass features.</p><blockquote><em>⚠</em> Be forewarned: ImageGlass Moon is designed for early adopters, and can contain bugs.</blockquote><p>By the way, I’m exploring blockchain world as well. I will post articles about it in the future! 😆</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e39aa26569bc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Use ImageGlass in designing]]></title>
            <link>https://d2phap.medium.com/use-imageglass-in-designing-e86af294eba8?source=rss-7e76d1910f11------2</link>
            <guid isPermaLink="false">https://medium.com/p/e86af294eba8</guid>
            <category><![CDATA[photos]]></category>
            <category><![CDATA[photoshop]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[imageglass]]></category>
            <category><![CDATA[colors]]></category>
            <dc:creator><![CDATA[Phap Duong]]></dc:creator>
            <pubDate>Sat, 16 Mar 2019 04:45:18 GMT</pubDate>
            <atom:updated>2019-05-13T14:10:56.868Z</atom:updated>
            <content:encoded><![CDATA[<p>Let’s go through some features of <a href="https://imageglass.org/">ImageGlass</a> that speed up your daily design work.</p><h3><strong>Set up mouse wheel actions</strong></h3><p>By default, scrolling mouse wheel does zooming in/out the viewing image in ImageGlass. Other editing applications (e.g. Photoshop, Illustrator,…) have awesome combinations of mouse wheel and keyboard that helps people to scroll the image horizontally/vertically.</p><p>Since version 5.0, ImageGlass has supported this feature and made it easily configurable in Settings dialog. There totally are 4 combinations, and 5 options for each of them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/935/1*A1ScPGUV1dZiZ2qFzn5HjA.png" /><figcaption>Change mouse wheel actions settings in ImageGlass 6.0</figcaption></figure><h3>Color picker tool</h3><p>This is an useful tool for designer as well as UI developer. From a mockup image file, you can quickly get the color code of image pixels in variety of formats. To enable it, you can open <em>Main menu</em> &gt; <em>Tools </em>&gt; <em>Color picker</em>, or press <em>Ctrl+Shift+K</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/779/1*lYkOM2gly3R8kcTLeYlXzg.png" /><figcaption>Enable Color picker tool in ImageGlass.</figcaption></figure><p>A small window will appear to display picked color in 4 formats: <em>RGB</em>, <em>HEX</em>, <em>CMYK </em>and <em>HSL</em>. If you want to pick alpha channel of the color, you can tick the respective checkboxes in <em>Settings </em>dialog &gt; <em>Color picker</em>. ImageGlass also supports pick color from animating GIF file as well.</p><blockquote><strong><em>💡 </em>Tip!</strong> <br>You can pause GIF animation by Ctrl+Space for more accurate.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/929/1*lyw5n6vlpZ6oI8s6-_SfQQ.png" /><figcaption>Pick a color with alpha channel in ImageGlass.</figcaption></figure><h3>Keep window always on top</h3><p>This small feature is helpful when you want to see the real-time preview of the editing image. You don’t need to split the desktop into 2 parts left-right, or keep on switching between application windows.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2TWn_ZdRfKJgFlNdK6RmAQ.png" /><figcaption>Display ImageGlass as preview window</figcaption></figure><p>To enable it, go to <em>Main menu</em> &gt; <em>Layout </em>&gt; <em>Keep window always on top</em>.</p><blockquote><strong><em>💡</em> Tip!</strong> <br>You can also hide the toolbar by unchecking Main menu &gt; Layout &gt; Toolbar, or pressing Ctrl+F1.</blockquote><h3>Summary</h3><p>Besides being a simple image viewer for common users, ImageGlass has been receiving more attentions from designers/professional people. Those above tips are just some of outstanding features that I think it’s really helpful in designing. I will share more tips in the next posts and hope you enjoy it!</p><p>Have a nice day!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e86af294eba8" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>