What rgb colors are you using for the colors on the Impression (Spectra 6)?

I’ve seen a lot of libraries that assume red #FF0000, yellow #FFFF00, green #00FF00, blue #0000FF — like monitor primaries.

However, they’re really a lot more muted than that, and particularly blue and green are quite a bit shifted. Just eying things against a pretty-decently calibrated sRGB monitor, I came up with:

red #a02020
yellow #f0e050
green #608050
blue #5080b8

… assuming you think of the black and white colors as “pure”. If you load the screen with the stripes.py demo and hold it next to this, it should be basically comparable. (With the screen being brighter, of course.)

What do you think?

I’d love to hear from people with more a discerning eye for color – or even better, someone with equipment for measuring the color directly in some way.

(My goal here is to get better dithering/mixing patterns…)

Great (I was planning to to the same)! In my CircuitPython-Inky repo (which you already discovered) are a few scripts that support dithering with pre-defined colormaps. If I find the time, I will try your colors.

I do have a hardware color-meter, but it won’t work with e-inks. It is closed hardware/software. You hang it in front of your screen, then it starts the software, sends many color-patches to the display and records the delta, thus creating a color-profile (which is more or less a fine-grained colormap).

Regarding dithering and the current Pimoroni Pi-drivers, see the discussion here: fix color-remapping for images that are already in platte mode by bablokb · Pull Request #221 · pimoroni/inky · GitHub. The discussion links to a PR that claims to fix things, but it will probably fail with your specific colormap. Otherwise, the linked PR is definitely an improvement.

The strategy of the Pimoroni driver is to merge two color-maps: one with pure colors (called “desaturated”, I don’t know why) and a second one (called “saturated”). Passing the saturation parameter to set_image() allows to tune the map that actually is used for the dithering.

1 Like

Hello!
I don’t have the new Spectra 6 inkys, only the old 7 colour ones (Inky Frame 7.3" and 5.7", Inky Impression 7.3") and for those I noticed that for dithering/error diffusion you need a different palette to what matches the screen palette. My dithering palette is defined in oklab, converted below to sRGB with a gamma of 2.4 so you can see them. This is because I use out of gamut colours to do dithering outside the sRGB colour range. Maybe my palettes can help you optimize for Spectra 6, I have included my experimental palette for it but I haven’t tested them on real hardware. Dither is the sRGB convert of palettes used for dithering and screen is what I use to look at result on a monitor.

Inky Frame 7.3" (Eink Gallery)

Original

1 Like

Thanks, very interesting. Could you post your dithering palette? Since ImageMagick supports oklab, I could update my scripts and do the dithering with your palette (currently I dither in RGB colorspace).

This is what your sample image looks like with ImageMagick dithering using pure colors:

Well … not really. After uploading it seems to be much darker. Probably the forum software converts the palette based png to something else, introducing more artefacts and changing colors.

Edit: you have to click on the image, then click on “original image” to see what it actually looks like.

Anyhow: my dither version does show nice blues like in the original image, it is not as muted as your examples. Dithering artefacts are also very different.

Have you experimented with the size of the dithered area? I’d rather sacrifice resolution for colors that appear more correct from a medium distance.

Can you elaborate on that? How would I change the “size of the dithered area”? Floyd-Steinberg does have a fixed matrix distributing the error to adjacent pixels. I know that there are other algorithms that distribute to more pixels using a larger matrix, but I haven’t seen it implemented in ImageMagick or PIL. But all of these algorithms don’t change the resolution, which in addition is fixed for the e-inks we are talking about.