Images were working in EE's native File Manager, but were blank in Assets. I checked all the usual suspects, reindexed them with native EE File Manager and Assets, but the problem persisted. Andris at Pixel & Tonic pointed to the problem.
It turns out my database.php file had an extra blank line at the beginning. (see that extra line?) And this was corrupting output in EE.
Any php file that is included (called by the main php file) needs to have the opening php tag on the first line! Otherwise bad things will happen.