Like most people, I take lots of photos. Like many people, I save them in the highest-quality format (often RAW). Like some people, I edit those pictures on a desktop computer.
Support for RAW images has gotten better over the years, but there are still many tools and programs that do not support these bespoke formats. So it's handy to have a quick and easy way to convert such photos into a widely-supported format like JPEG. There are many tools to do so, but it's hard to beat a command line script for simplicity and ease of use.
I didn't know of one that met my criteria, so I wrote a PowerShell script:
ConvertTo-Jpeg - A PowerShell script that converts RAW (and other) image files to the widely-supported JPEG format
- This script uses the Windows.Graphics.Imaging API to decode and encode.
That API supports a variety of file formats and when new formats are added to the list, they are automatically recognized by the script.
Because the underlying implementation is maintained by the Windows team, it is fast and secure.
- As it happens, support for a new format showed up in the days since I wrote this script: Windows 10's April 2018 Update added support for HEIC/HEIF images such as those created by iPhones running iOS 11.
- The Windows.Graphics.Imaging API is intended for use by Universal Windows Platform (UWP) applications, but I am using it from PowerShell.
This is unfortunately harder than it should be, but allowed me to release a single script file which anybody can read and audit.
- Transparency is not a goal for everyone, but it's important to me - especially in today's environment where malware is so prevalent. I don't trust random code on the Internet, so I prefer to use - and create - open implementations when possible.
- The choice of PowerShell had some drawbacks. For one, it is not a language I work with often, so I spent more time looking things up than I normally do. For another, it's clear that interoperating with UWP APIs is not a core scenario for PowerShell. In particular, calling asynchronous methods is tricky, and I did a lot of searching before I found a solution I liked: Using WinRT's IAsyncOperation in PowerShell.
- There are some obvious improvements that could be made, but I deliberately started simple and will add features if/when the need arises.