Skip to main content

Description

Affiche le résultat d’une requête sous forme d’image PNG. C’est utile comme outil de visualisation intégré. La taille de l’image de sortie est définie par les paramètres output_format_image_width et output_format_image_height (tous deux définis par défaut sur 1024). Les pixels non couverts par le résultat sont remplis de noir (en modes RGB et en niveaux de gris) ou de noir transparent (en mode RGBA). Le mode colorimétrique est déterminé automatiquement à partir des noms et des types des colonnes du résultat : Les noms des colonnes sont comparés sans tenir compte de la casse. Si le mode colorimétrique ne peut pas être déterminé de manière non ambiguë (par exemple, noms de colonnes inconnus, mélange de v avec r/g/b/a, ou absence de l’un de r/g/b), la requête lève une exception. Pour les canaux de pixel, les valeurs entières sont limitées à [0, 255] et les valeurs à virgule flottante à [0, 1], puis mises à l’échelle vers [0, 255]. La position de chaque enregistrement dans l’image est déterminée selon l’un des deux modes suivants :
  • implicite (par défaut — lorsque ni x ni y n’est présent). Chaque enregistrement correspond à un seul pixel ; les pixels sont remplis dans l’ordre de balayage : de gauche à droite, de haut en bas.
  • explicite (lorsque les colonnes x et y sont présentes, toutes deux de type entier). Les colonnes x et y donnent les coordonnées du pixel. Les enregistrements dont les coordonnées sont en dehors de l’image sont ignorés silencieusement. Si plusieurs enregistrements ont les mêmes coordonnées, le dernier prévaut (algorithme du peintre).

Exemple d’utilisation

Coordonnées implicites (une ligne par pixel), RVB

Coordonnées explicites, niveaux de gris

Animation

Si le résultat comporte une colonne t de type integer, le format produit un PNG animé (APNG) au lieu d’une image fixe. Les enregistrements sont regroupés en images par la valeur de t, qui correspond au décalage temporel relatif de l’image. Chaque image est indépendante : le canevas est vide au début de chaque image et, dans le mode de coordonnées implicites, le curseur repart du coin supérieur gauche. La colonne t peut être associée à l’un ou l’autre mode de coordonnées. L’unité de t est définie par output_format_image_time_multiplier_seconds et output_format_image_time_divisor_seconds : une unité de t correspond à output_format_image_time_multiplier_seconds / output_format_image_time_divisor_seconds secondes. Avec les valeurs par défaut (1 et 60), une unité de t correspond à 1/60e de seconde. Une image est affichée jusqu’au début de l’image suivante ; sa durée correspond donc à la différence entre deux valeurs consécutives de t. La dernière image est affichée aussi longtemps que l’image qui la précède. L’animation se répète indéfiniment.

Diffusion des images

Par défaut, toutes les images sont collectées en mémoire et écrites à la fin de la requête, ce qui conserve un tampon d’image par valeur distincte de t et permet à t d’arriver dans n’importe quel ordre. Le paramètre output_format_image_streaming_animation écrit chaque image dès que la valeur suivante de t est reçue. Un seul tampon d’image est conservé en mémoire et les images sont envoyées vers la sortie alors que la requête est encore en cours d’exécution, ce qui permet à un visualiseur de les afficher au fur et à mesure de leur production. En contrepartie :
  • t doit être non décroissant ; sinon, la requête lève une exception. Ajoutez ORDER BY t si nécessaire.
  • Le nombre d’images n’est pas connu au moment où l’en-tête doit être écrit ; le fragment acTL déclare donc une limite supérieure plutôt que le nombre exact. Les navigateurs lisent un tel fichier, mais les décodeurs qui se fient au nombre déclaré (par exemple, Pillow et certains outils APNG en ligne de commande) signalent une erreur après la dernière image réelle. Une animation à une seule image fait exception : le résultat complet a été lu lorsque cette image est écrite, de sorte que le nombre est déclaré avec exactitude et que la sortie est conforme à la spécification.
Comme un protocole d’image intégré au terminal transporte l’intégralité du flux de données dans une seule charge utile, les images ne peuvent pas parvenir au terminal de manière anticipée, et ce paramètre n’y affecte que la quantité de mémoire utilisée. Le nombre exact d’images est corrigé dans la charge utile mise en mémoire tampon avant son envoi ; la réserve concernant la limite supérieure ne s’applique donc pas. Une animation n’est affichée qu’en mode terminal iterm. Le protocole sixel ne peut pas représenter une animation, et le protocole graphique Kitty n’anime qu’au moyen d’un flux distinct de commandes par image, et non d’un flux de données animé ; il n’afficherait donc que la première image. Les deux modes rejettent un résultat contenant une colonne t.

Affichage des images dans le terminal

Par défaut, le format PNG écrit les octets bruts de l’image. Le paramètre output_format_image_terminal_mode fait plutôt afficher l’image directement dans le terminal au moyen d’un protocole d’image intégré :

Paramètres du format

Dernière modification le 14 août 2026