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 é de 8 bits. Como existem 256 combinações de 8 bits, isso significa que um byte é qualquer número de 0 a 255. Portanto, todo arquivo é, no nível mais baixo, um grande número de números que variam de 0 a 255.
Depende completamente dos programas e usuários decidirem o que os números "significam". Se queremos armazenar texto, provavelmente é uma boa ideia usar os números como código, onde cada número recebe uma letra. É o que ASCII e Unicode fazem. Se quisermos exibir texto, provavelmente é uma boa ideia criar um dispositivo ou escrever um programa que possa receber esses números e exibir um bitmap parecido com o código ASCII / Unicode correspondente. É isso que os terminais e emuladores de terminal fazem.
Obviamente, para gráficos, provavelmente queremos que os números representem pixels e suas cores. Em seguida, precisaremos de um programa que analise o arquivo, leia todos os bytes e renderize a imagem adequadamente. Um emulador de terminal espera que os bytes sejam números ASCII / Unicode e se comportará de maneira diferente, para o mesmo pedaço de bytes (ou arquivo).