The classic Macintosh 1-bit filter, as used by Hyperdither
Compares every pixel to 50% grey, then changes them to either black or white. The difference between the input and the output is then distributed to the neighbouring pixels as follows (X is the current pixel):
X 1/8 1/8
1/8 1/8 1/8
1/8
This code uses Drag and Drop events, WebWorkers and the FileReader API so you'll need a current browser to try it.
(Oh, and of course, CoffeeScript, to compile the files into JS)