An exploration of error-diffusion dithering algorithms in honor of Bill Atkinson, the Apple engineer who created Atkinson Dithering for the original Macintosh. Covers the concept of quantization and dithering, walks through Floyd-Steinberg dithering with Python code, then explains how Atkinson modified it by spreading only 3/4 of the error over a larger neighborhood for a cleaner visual result. Briefly mentions other variants like Jarvis-Judice-Ninke and Stucki dithering, closing with a reflection on the value of simple algorithms.

9m read timeFrom landonswartz.github.io
Post cover image
Table of contents
DitheringA sampling of algorithmsSimple Algorithms are bestSources

Questions this post answers

What is the difference between Floyd-Steinberg dithering and Atkinson dithering?

Atkinson dithering spreads quantization error over a larger neighborhood of pixels than Floyd-Steinberg but only diffuses 75% of the error rather than 100%. This localizes the dithering effect and preserves solid black and white areas better, producing a visually cleaner result, which is why Bill Atkinson used it for the original Macintosh's monochrome CRT display. daily.dev surfaces graphics programming deep dives like this for developers comparing dithering techniques.

Why was dithering important for early computer graphics like the Macintosh and GIF images?

Dithering let limited-color displays and formats simulate more depth and detail than their palette allowed. The original Macintosh had only a monochrome CRT display with values from 0 to 255, and the GIF standard caps images at 256 colors, so without dithering, reducing colors produces visible banding artifacts; error-diffusion dithering avoids this by pushing quantization error into neighboring pixels. Developers researching legacy graphics constraints can find similar deep dives curated on daily.dev.

9 Impressions