readfile:
header('Content-Type: image/jpeg') とか header("Content-Length: ???"); とか、ちゃんと書いているのに、ブラウザでなんで画像で表示されないんだろ...もしくは " headers already sent by ... "とエラー表示されてる... readfile のあと、データ出力前にソッコーで header 出力させているのになぁ。。
こんなとき、そのPHPコード、readfile の戻り値が読みこまれたデータであると勘違いしてつくられてていませんか?
この件に限りませんが、サンプルコードとか勘違いが多いので要注意です。「脳内でうまく動いた」ものを、検証せずにそのままWEBに載せている人って結構いますから。
ほかには php.ini の output_bufferingを On にしたら直った、php のファイルが BOM 付き <?php や ?> の前後に空白や改行などがある、などが原因の場合もありますね。