Como visualizar dados binários brutos como uma imagem com largura e altura especificadas?

15

Existe um programa para Linux que possa exibir dados binários brutos?

Cada byte nos meus arquivos binários representa um pixel, por isso seria muito útil se algo assim existisse onde eu pudesse dizer

program_name --input=dat001.bin --width=200 --height=100

e exibiria os pixels.

Gostaria de saber se o gnuplot, pode ser usado para isso ...?

Sandra
fonte
2
A pergunta não faz sentido. Para exibir dados binários brutos, eles devem ser convertidos em um formato legível por humanos. Normalmente, esse formulário é hexadecimal, que você pode usar hdpara formatar. Então você pede para ver uma imagem. Se for uma imagem, será em um formato de imagem (como bmp) que terá no mínimo um cabeçalho que identifique o formato, a largura, a altura, a profundidade da cor e talvez também tenha uma paleta de cores em anexo.
Psusi
@psusi Embora o título seja melhor Como exibir dados brutos de pixels , a intenção desta pergunta é clara e totalmente faz sentido para mim. ("Quero que um programa permita que eu especifique os metadados da imagem") Faz mais sentido retrospectivamente (ou talvez depois da edição) para você também?
Nathan Kidd
@ NathanKidd, ahh, sim ... se você sabe que é uma imagem usando um formato específico, mas não tem cabeçalho, em vez de ser apenas dados binários arbitrários ... entendi.
psusi 04/09/2015
11
askubuntu.com/questions/147554/…
Ciro Santilli escreveu
ffmpeg lata para ele: stackoverflow.com/a/15037011/5447906
anton_rh

Respostas:

12

Para ver os "dados binários brutos", eu usaria o comando hex dump hdouhexdump

$ hd -C a.txt
00000000 61 0a 61 61 0a 61 61 61 0a 61 61 61 61 0a 61 61 | a.aa.aaa.aaaa.aa |
00000010 61 61 61 0a 62 62 62 0a 62 62 62 62 0a 62 62 62 | aaa.bbb.bbbb.bbb |
00000020 62 62 0a 3c 62 65 67 69 6e 3e 0a 61 61 61 61 61 | bb. <Inicie> .aaaaa |
00000030 61 0a 61 61 61 61 61 61 61 0a 61 61 61 61 61 61 | a.aaaaaaa.aaaaaa |
00000040 61 61 0a | aa.
00000043

Não conheço nenhum formato de imagem que consista em bytes não estruturados - os dados são valores RGB de 8 bits? Se o arquivo contiver 30000 bytes, é RGB para 100x100 pixels ou RGB para 50x200 pixels ou RGB para 200x50 pixels ou algo mais? Existe uma paleta? Você precisa saber algo sobre a organização dos dados!

Para visualizá-lo como uma imagem, eu usaria os utilitários NetPBM ou talvez o ImageMagick para convertê-lo em um formato compreendido por um visualizador de imagens

Se o acima não puder fazer o trabalho, eu investigaria a escrita de um pequeno script Perl

RedGrittyBrick
fonte
Onde posso conseguir isso? Acabei de fazer yum search hdno meu desktop Fedora, e ele não o possui.
28611 Sandra
OK. Eu preciso ver as pxiels como gráfico ...
Sandra
2
O binário pode ser chamado hexdump. No SuSE está no util-linuxpacote.
Turbo J
FWIW também está hexdumpem Arch.
Sparhawk
10

convertdo ImageMagick pode fazê-lo.

Por exemplo, uma escala de cinza 2x3 de 8 bits:

printf '\x00\xFF\x88\xFF\x00\xFF' > f

Então:

convert -depth 8 -size 3x2+0 gray:f out.png

Explicação do comando:

  • -depth 8: cada cor tem 8 bits
  • -size 2x3+0: 2x3imagem. +0significa começar no deslocamento 0 no arquivo. Se houver cabeçalhos de metadados, você poderá ignorá-los com o deslocamento.
  • gray:f: o arquivo de entrada é fe o formato é gray, conforme definido em http://www.imagemagick.org/script/formats.php Essa notação estranha é usada porque o ImageMagick geralmente determina o formato da extensão, mas aqui não há extensão .

O problema agora é como visualizar a saída. Um direto eog:

eog out.png

não é muito bom porque a imagem é muito pequena e, se você aumentar muito o zoom, eogusa um algoritmo de exibição que mistura pixels, o que é melhor para a maioria das fotos, mas não no nosso caso. Encontrei duas possibilidades:

  • gimp out.png. Os editores de imagens devem mostrar cada pixel.
  • convert out.png -scale 300x200 out2.png. -scaleé necessário em vez de -resize, já que -resizemistura pixels de maneira semelhante eogà padrão.

Resultado:

insira a descrição da imagem aqui

Exemplo de RGB:

printf '\xFF\x00\x00\x00\xFF\x00\x00\x00\xFF' > f
convert -depth 8 -size 3x1+0 rgb:f out.png

insira a descrição da imagem aqui

Testado no Ubuntu 16.04, ImageMagick 6.8.9.

Ciro Santilli adicionou uma nova foto
fonte
11
Outro exemplo: se você tem um arquivo no formato RGBA (digamos /tmp/tex1.dat), você pode ver a imagem convertida diretamente com Imagemagick de displaycomo a imagem de 128x256 pixels comdisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau
E se os pixels tiverem 10 ou 12 bits? Eu tentei a -endianopção, mas parece que funciona como o -depth 16, a imagem é muito escura
sop
@sop não tenho certeza sobre 10 12. 12 pode funcionar com profundidade 12? 10 Espero que você precise especificar mais quantos bits por canal, já que 10 não é divisível por 4 (RGBA) nem 3 (RGB). Nao tenho certeza de como fazer isso.
Ciro Santilli escreveu:
4

Se não quiser visualizá-lo diretamente, mas convertê-lo, o utilitário de conversão pode fazer isso:

Para ler a partir do stdin, assumindo 320 x 200 pixels, cinza de 8 bits, cabeçalho 0, salvando em pic.png no formato PNG.

convert -depth 8 -size 320x200+0 gray:- pic.png
devilholk
fonte
11
Para os novatos como eu: gray:-significa formato graye -significa stdin. Portanto, o comando atual trava aguardando stdin. Eu expliquei-lo ainda mais em minha resposta: superuser.com/a/978432/128124
Ciro Santilli新疆改造中心法轮功六四事件