Oh, wait I did "-encoding binary" in my second test where it should have been "-translation binary".

Using "-translation binary" causes it to be read correctly.

<verbatim>
% set fd [open cross.png r]
mk7
% fconfigure $fd -translation binary
% set data [read $fd]; puts [string length $data]
655
% binary scan $data H* data_hex
1
</verbatim>