Pode ser útil explicar como os arquivos funcionam no nível mais baixo:
Um arquivo é um fluxo de bytes com zero ou mais de comprimento. Um byte é 8 bits. Como há 256 combinações de 8 bits, isso significa que um byte é qualquer número de 0 a 255. Portanto, todo arquivo tem, no nível mais baixo, um grande número de números, variando de 0 a 255.
Cabe aos programas e usuários decidir o que os números "significam". Se queremos armazenar texto, provavelmente é uma boa idéia usar os números como código, onde cada número é atribuído a uma letra. Isso é o que ASCII e Unicode fazem. Se quisermos exibir texto, talvez seja uma boa ideia criar um dispositivo ou escrever um programa que possa pegar esses números e exibir um bitmap com o código ASCII / Unicode correspondente. Isso é o que os terminais e os emuladores de terminal fazem.
Claro, para gráficos, provavelmente queremos que os números representem pixels e suas cores. Então, precisaremos de um programa que passe pelo arquivo, leia todos os bytes e renderize a imagem de acordo. Um emulador de terminal está esperando que os bytes sejam números ASCII / Unicode e vai se comportar de maneira diferente, para o mesmo bloco de bytes (ou arquivo).