¿Cómo ver datos binarios sin procesar como una imagen con ancho y alto dados?

15

¿Existe un programa para Linux que pueda mostrar datos binarios sin procesar?

Cada byte en mis archivos binarios representa un píxel, por lo que sería muy útil si existiera algo como esto donde pudiera decir

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

y mostraría los píxeles.

Me pregunto si gnuplot, se puede utilizar para esto ...?

Sandra
fuente
2
La pregunta no tiene sentido. Para mostrar datos binarios sin procesar, debe convertirse a una forma legible por humanos. Por lo general, este formulario es hexadecimal, que puede usar hdpara formatear. Luego pides ver una imagen. Si se trata de una imagen, tendrá un formato de imagen (como bmp) que, como mínimo, tendrá un encabezado que identifica el formato, el ancho, la altura, la profundidad de color y quizás también una paleta de colores. adjunto.
psusi
@psusi Si bien el título sería mejor Cómo mostrar datos de píxeles sin procesar , la intención de esta pregunta es clara y tiene mucho sentido para mí. ("Quiero un programa que me permita especificar los metadatos de la imagen") ¿Tiene más sentido en retrospectiva (o tal vez después de la edición) para usted también?
Nathan Kidd
@NathanKidd, ahh, sí ... si sabes que es una imagen que usa un formato específico pero no tiene encabezado, en lugar de ser solo datos binarios arbitrarios ... te tengo.
psusi
1
askubuntu.com/questions/147554/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
ffmpeg puede hacerlo: stackoverflow.com/a/15037011/5447906
anton_rh

Respuestas:

12

Para ver los "datos binarios sin procesar", usaría el comando de volcado hexadecimal hdohexdump

$ 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. <Principio> .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

No conozco ningún formato de imagen que consista en bytes no estructurados: ¿los datos son valores RGB de 8 bits? Si el archivo contiene 30000 bytes, ¿es RGB para 100x100 píxeles o RGB para 50x200 píxeles o RGB para 200x50 píxeles o algo más? ¿Hay una paleta? ¡Tienes que saber algo sobre la organización de los datos!

Para verlo como una imagen, usaría las utilidades de NetPBM o tal vez ImageMagick para convertirlo a un formulario entendido por un visor de imágenes

Si lo anterior no puede hacer el trabajo, investigaría escribir un pequeño script de Perl

RedGrittyBrick
fuente
¿Dónde puedo conseguir esto? Acabo de hacerlo yum search hden mi escritorio Fedora, y no lo tenía.
Sandra
Bueno. Necesito ver los pxiels como gráficos ...
Sandra
2
El binario podría ser llamado hexdump. En SuSE está en el util-linuxpaquete.
Turbo J
FWIW también está hexdumpen Arch.
Sparhawk
10

convertde ImageMagick puede hacerlo.

Por ejemplo, una escala de grises 2x3 de 8 bits:

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

Luego:

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

Explicación del comando:

  • -depth 8: cada color tiene 8 bits
  • -size 2x3+0: 2x3imagen. +0significa comenzar en el desplazamiento 0 en el archivo. Si hay encabezados de metadatos, puede omitirlos con el desplazamiento.
  • gray:f: el archivo de entrada es f, y el formato es gray, como se define en http://www.imagemagick.org/script/formats.php Esta notación extraña se usa porque ImageMagick generalmente determina el formato de la extensión, pero aquí no hay extensión .

El problema ahora es cómo ver la salida. Un directo eog:

eog out.png

no es muy bueno porque la imagen es demasiado pequeña, y si se eogacerca mucho, utiliza un algoritmo de visualización que mezcla píxeles, que es mejor para la mayoría de las imágenes, pero no en nuestro caso. Encontré dos posibilidades:

  • gimp out.png. Los editores de imágenes deben mostrar cada píxel.
  • convert out.png -scale 300x200 out2.png. -scalees necesario en lugar de hacerlo -resize, ya que los -resizepíxeles mixels se elevan de manera muy similar eoga la predeterminada.

Salida:

ingrese la descripción de la imagen aquí

Ejemplo RGB:

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

ingrese la descripción de la imagen aquí

Probado en Ubuntu 16.04, ImageMagick 6.8.9.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
1
Otro ejemplo: si tiene un archivo en formato RGBA (digamos /tmp/tex1.dat), puede ver la imagen convertida directamente con Imagemagick displaycomo imagen de 128x256 píxeles condisplay -depth 8 -size 128x256+0 RGBA:/tmp/tex1.dat
sdaau
¿Qué pasa si los píxeles tienen 10 o 12 bits? He probado la -endianopción, pero parece que funciona como -depth 16, la imagen es muy oscura
sop
@sop no estoy seguro acerca de 10 12. 12 podría funcionar con profundidad 12? 10 Espero que necesite especificar más cuántos bits por canal, ya que 10 no es divisible por 4 (RGBA) ni 3 (RGB). No estoy seguro de cómo hacer esto.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Si no quiere verlo directamente, sino convertirlo, la utilidad de conversión puede hacer esto:

Para leer desde stdin, suponiendo 320 x 200 píxeles, gris de 8 bits, encabezado de 0, guardando en pic.png en formato PNG.

convert -depth 8 -size 320x200+0 gray:- pic.png
diablo
fuente
1
Para los novatos como yo: gray:-significa formato grayy -medios de stdin. Por lo tanto, el comando actual se cuelga esperando stdin. Lo he explicado más en mi respuesta: superuser.com/a/978432/128124
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件