Données binaires avec Gnuplot

Gnuplot

Exemple à partir du fichier http://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/RGBR.png/120px-RGBR.png de Wikimedia illustrant le modèle RGB en 24 bits.

http://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/RGBR.png/120px-RGBR.png

Cette image est convertie au format ppm qui comprend un en-tête ASCII précisant la taille de l'image et le nombre maximal de couleurs:

  P6
  # CREATOR: The GIMP's PNM Filter Version 1.0
  120 120
  255

Affiché en hexadécimal, on peut voir que l'en-tête comprend 60 octets (ne pas oublier le dernier saut de ligne `0a`) qui devront être passés lors de la lecture des données:

  0000000: 5036 0a23 2043 5245 4154 4f52 3a20 5468  P6.# CREATOR: Th
  0000010: 6520 4749 4d50 2773 2050 4e4d 2046 696c  e GIMP's PNM Fil
  0000020: 7465 7220 5665 7273 696f 6e20 312e 300a  ter Version 1.0.
  0000030: 3132 3020 3132 300a 3235 350a fdfd 00f9  120 120.255.....
  0000040: fd00 f5fd 00f1 fd00 ecfd 00e8 fd00 e4fd  ................

On peut afficher un seul des 3 canaux de couleur selon l'une ou l'autre de ces méthodes:

  gnuplot> plot 'RGBR.ppm' binary array=(120,120) format='%uchar%uchar%uchar' \
           skip=60 flipy using1  with image
  gnuplot> plot 'RGBR.ppm' binary array=(120,120) format='%uchar%*uchar%*uchar' \
           skip=60 flipy  with image

Dans le premier cas, on sélectionne la «colonne» avec l'instruction using 1, dans le second, on insère un * dans la chaîne de format de façon à ce que les octets 2 et 3 ne soient pas lus. La suite d'instruction suivante modifie la palette pour obtenir l'image qui suit

  gnuplot> set cbrange [0:255]
  gnuplot> set palette rgbformulae 3,0,0
  gnuplot> plot 'RGBR.ppm' binary array=(120,120) format='%uchar%*uchar%*uchar' \ 
           skip=60 flipy  with image notitle

http://www.k1ka.be/pics/gnuplot/red.png

Pour reconstituer l'image, on utilise rgbimage qui utilisera les 3 colonnes comme un nombre sur 24 bits:

  gnuplot> plot 'RGBR.ppm' binary array=(120,120) format='%uchar%uchar%uchar' \
           skip=60 flipy with rgbimage

http://www.k1ka.be/pics/gnuplot/rgbimage.jpg