I was converting a PNG (which represented partials sums of the Weierstrass elliptic function) to a GIF and was confused about why the PNG looked fine at low resolution but the GIF looked bad.
Then I learned that GIFs can only use 256 colors and we have to do something to map the many colors to the fewer colors. We could just use the closest available color in the new set of colors, but that results in sharp jumps and "color banding" where the colors change.
So instead we use (and ImageMagick's default is) dithering, which assigns pixels to a mixture of color values that locally average to the appropriate shade. I had a great time reading about this in ImageMagick's documentation! Here's a description of the default method:
The pixel is assigned the color closest to that pixels value, and any difference between the pixels original color and the selected color, is saved and added to the next pixels color values (which is always a neighbouring pixel) before a new color is again selected. In this way any color variations between selected colors and the images original color is distributed to the other pixels in the same area. The result is that while only specific colors will be assigned to the final image, the same basic overall color for that area will closely match the original image.
When there aren't enough dots, the picture looks blurry.
|Resolution: 800x600||Resolution: 200x150|
|PNG (lots of colors)|
|no dither (GIF, 256 colors)|
|default dither (GIF, 256 colors)|
Here's my code on Github, and here are the ImageMagick commands that produced these:
convert -resize 100% -dither None ./zoomed_in/Weierstrass001.png ./res100no_dither.gif convert -resize 50% -dither None ./zoomed_in/Weierstrass001.png ./res50no_dither.gif convert -resize 100% ./zoomed_in/Weierstrass001.png ./res100default_dither.gif convert -resize 25% ./zoomed_in/Weierstrass001.png ./res25default_dither.gif convert -resize 100% ./zoomed_in/Weierstrass001.png ./res100many_colors.png convert -resize 25% ./zoomed_in/Weierstrass001.png ./res25many_colors.png