There is a bug in Chrome which means that, under some circumstances, an image can be displayed on the page for a moment and then disappear.
The fix is to remove the Content-Length header. Unfortunately that is virtually impossible to do in Drupal without hacking core.
Going into this problem revealed an interesting omission: the file_download() function collects headers from interested modules, but if two modules offer the same header the earlier one gets overwritten. Heavier modules can overwrite the headers of lighter modules.
So making my module heavy would mean that I could overwrite Content-Length with NULL.
But this is not a good solution. What's missing is that, after collecting the headers, file_download() does not use drupal_alter() to allow modules to change the headers.
So the correct solution is a patch which inserts drupal_alter('file_download_headers', $headers, $uri) into the file_download() function at the correct location. And you can find the patch here:
All I had to do then was create a function that implemented hook_file_download_headers() which took a look at the $uri and, if it's a graphic, remove the Content-Length header, which is perfectly safe because it's not a critical header.