Adobe Photoshop is not inexpensive. But if you’re fortunate enough to already have it, this does make conversion a bit simpler.
To begin, download and unzip these Photoshop color tables:
Your source image should be in RGB mode (Image→Mode→RGB) if it isn’t already. Use the Image Size and/or crop tools to match the dimensions of your image(s) to your e-ink display.
Then we’ll do the e-ink conversion using Image→Mode→Indexed Color…
From the “Palette:” menu, select “Custom…” then click the “Load…” button to import one of the color tables from the ZIP you downloaded above. Use “eink-3color” to process images for 3-color displays, “eink-2color” for monochrome (black & white) displays, and “eink-4gray” for 4-level grayscale displays.
Then experiment with settings in the Options pane to get the effect you desire (keep the “Preview” box checked to see the results interactively).
Diffusion dithering used here gives us the most bang-for-buck in most cases.
Try different “Amount” settings until you find the right compromise between “too contrasty” (lower values) and “too snowy” (higher values). This is very subjective and the ideal setting will vary from image to image!
Let’s see how different settings affect 2-color (left), 3-color (center) and 4-level gray (right) images:
A couple of alternate dither settings might be useful in certain situations…
Pattern dithering uses a uniform dot arrangement. It’s usually not the best for photos, as it tends to lose edge details, but may provide a “clean” look for flat artwork and diagrams:
Unlike ImageMagick (explained on the prior page), Photoshop just has one pattern dither setting, there are no available tweaks.
The “None” dither setting may be useful for text, high-contrast line art and 1980s Patrick Nagel prints:
Photoshop also has a “Noise” dither setting — it looks okay for ultra-high-DPI printed matter but is not well suited for these displays.
Once you have a satisfactory conversion, we’ll export in BMP format…it’s a relatively easy image format for microcontrollers to handle. As explained on the overview page, you have some options here depending on what code you’ll be using to display the image…
If your target system is CircuitPython, select File→Save As… then choose the “4 Bit” option here.
And if your CircuitPython code will be using the adafruit_imageload library (rather than displayio.OnDiskBitmap), you can check the “Compress (RLE)” box to save a little bit of space. If you’re not sure, or might be using both libraries in different situations, leave this unchecked.
And for Arduino with the Adafruit_ImageReader library, first change the image’s color mode back to RGB (Image→Mode→RGB Color…don’t simply Undo, we need the dithered version but in RGB mode, not the original image), then select File→Save As…
Choose the “24 Bit” option and save.
Some displays operate natively in a “portrait” orientation (tall vs wide). If your source image is in the opposite orientation, you have two choices…
1. In your CircuitPython code, instruct the display to use a different rotation setting, e.g.:
display.rotation = 1
display.rotation = 1
(try 0, 1, 2 or 3)
2. Alternately, leave the code unchanged and rotate the image using Photoshop:
Image→Image Rotation→90° Clockwise or
Image→Image Rotation→90° Counter Clockwise
Then save as a BMP as described above.