| Entrada | Salida | Alias |
|---|---|---|
| ✗ | ✔ | ✗ |
Descripción
Representa el resultado de una consulta como una imagen PNG. Resulta útil como herramienta de visualización integrada.
El tamaño de la imagen de salida viene determinado por los ajustes
output_format_image_width y
output_format_image_height
(ambos con un valor predeterminado de 1024). Los píxeles no cubiertos por el resultado se rellenan de negro
(en los modos RGB y escala de grises) o de negro transparente (en modo RGBA).
El modo de color se determina automáticamente a partir de los nombres y tipos de las columnas del resultado:
| Columnas | Modo |
|---|---|
r, g, b |
RGB de 8 bits |
r, g, b, a |
RGBA de 8 bits |
v de tipo entero |
escala de grises de 8 bits |
v de tipo Float* |
escala de grises de 8 bits (valores de [0, 1] → [0, 255]) |
v de tipo Bool |
Binario (representado como escala de grises de 8 bits: 0 o 255) |
Los nombres de las columnas se comparan sin distinguir entre mayúsculas y minúsculas. Si el modo de color no puede
determinarse de forma inequívoca (por ejemplo, por nombres de columna desconocidos, v mezclado con r/g/b/a, o por faltar uno de r/g/b),
la consulta genera una excepción.
Para los canales de píxel, los valores enteros se limitan a [0, 255] y los valores de coma flotante
se limitan a [0, 1] y luego se escalan a [0, 255].
La posición de cada registro en la imagen se determina mediante uno de estos dos modos:
- Implícito (el predeterminado — cuando no está presente ni
xniy). Cada registro corresponde a un único píxel; los píxeles se rellenan en orden de barrido: de izquierda a derecha y de arriba abajo. - Explícito (cuando están presentes las columnas
xey, ambas de tipo entero). Las columnasxeyindican las coordenadas del píxel. Los registros con coordenadas fuera de la imagen se ignoran silenciosamente. Si hay varios registros con las mismas coordenadas, prevalece el último (algoritmo del pintor).
Ejemplo de uso
Coordenadas implícitas (una fila por píxel), RGB
SELECT
toUInt8(x * 25) AS r,
toUInt8(y * 25) AS g,
toUInt8((x + y) * 12) AS b
FROM
(
SELECT number % 10 AS x, intDiv(number, 10) AS y FROM numbers(100)
)
INTO OUTFILE 'gradient.png'
FORMAT PNG
SETTINGS output_format_image_width = 10, output_format_image_height = 10;Coordenadas explícitas, escala de grises
SELECT
toInt32(x) AS x,
toInt32(y) AS y,
toUInt8(intensity) AS v
FROM points
INTO OUTFILE 'points.png'
FORMAT PNG
SETTINGS output_format_image_width = 512, output_format_image_height = 512;Animación
Si el resultado tiene una columna t de tipo entero, el formato genera un PNG animado (APNG) en lugar de una
imagen estática. Los registros se agrupan en fotogramas según el valor de t, que representa el desfase temporal relativo del
fotograma. Cada fotograma es una imagen independiente: el lienzo está vacío al inicio de cada fotograma y, en el
modo de coordenadas implícitas, el cursor vuelve a empezar desde la esquina superior izquierda. La columna t se puede combinar con
cualquiera de los modos de coordenadas.
La unidad de t viene dada por
output_format_image_time_multiplier_seconds
y
output_format_image_time_divisor_seconds:
una unidad de t equivale a output_format_image_time_multiplier_seconds / output_format_image_time_divisor_seconds
segundos. Con los valores predeterminados (1 y 60), una unidad de t equivale a 1/60 de segundo.
Un fotograma se muestra hasta que comienza el siguiente, por lo que su duración es la diferencia entre dos valores consecutivos
de t. El último fotograma se muestra durante el mismo tiempo que el anterior. La animación se repite indefinidamente.
SELECT
number % 60 AS t,
toInt32(intDiv(number, 60) % 64) AS x,
toInt32((number * 7) % 64) AS y,
toUInt8(255) AS v
FROM numbers(60 * 64)
INTO OUTFILE 'animation.png'
FORMAT PNG
SETTINGS output_format_image_width = 64, output_format_image_height = 64;Transmisión de fotogramas
De forma predeterminada, todos los fotogramas se recopilan en memoria y se escriben al final de la consulta, lo que mantiene un búfer de imagen
por cada valor distinto de t y permite que t llegue en cualquier orden.
La configuración
output_format_image_streaming_animation
escribe cada fotograma en cuanto se detecta el siguiente valor de t. Solo se mantiene un búfer de imagen en memoria y los
fotogramas llegan a la salida mientras la consulta aún se está ejecutando, por lo que un visor puede mostrarlos a medida que se generan.
A cambio:
tdebe ser no decreciente; de lo contrario, la consulta genera una excepción. AñadaORDER BY tsi es necesario.- Se desconoce el número de fotogramas cuando debe escribirse la cabecera, por lo que el fragmento
acTLdeclara un límite superior en lugar del recuento exacto. Los navegadores reproducen este tipo de archivo, pero los decodificadores que se basan en el recuento declarado (por ejemplo,Pillowy algunas herramientasAPNGde línea de comandos) informan de un error después del último fotograma real. Una animación de un solo fotograma es la excepción: para cuando se escribe ese fotograma, se ha leído todo el resultado, por lo que el recuento se declara exactamente y la salida cumple la especificación.
Dado que un protocolo de imágenes de terminal en línea transporta todo el flujo de datos como una única carga útil, los fotogramas no pueden llegar antes al terminal y esta configuración solo afecta a la cantidad de memoria utilizada. El recuento exacto de fotogramas se corrige en la carga útil almacenada temporalmente en el búfer antes de enviarla, por lo que no se aplica la salvedad sobre el límite superior.
Una animación solo se muestra en el modo de terminal iterm. El protocolo sixel no puede representar
animaciones, y el protocolo de gráficos Kitty solo anima mediante un flujo independiente de comandos por fotograma,
no mediante un flujo de datos animado, por lo que mostraría únicamente el primer fotograma; ambos modos rechazan un resultado con
una columna t.
Mostrar imágenes en la terminal
De forma predeterminada, el formato PNG escribe los bytes sin procesar de la imagen. La configuración
output_format_image_terminal_mode
hace que el formato muestre la imagen directamente en la terminal mediante un protocolo de imagen en línea:
| Valor | Comportamiento |
|---|---|
| `` (vacío) | Escribe los bytes sin procesar de la imagen (comportamiento predeterminado). |
iterm |
Usa el protocolo de imagen en línea de iTerm2. |
kitty |
Usa el protocolo de gráficos de Kitty. No puede mostrar animaciones. |
sixel |
Usa el protocolo Sixel. La imagen se reduce a una paleta fija de 6×6×6 y el canal alfa, si existe, se compone sobre un fondo negro. |
auto |
Si la salida es una terminal, detecta sus capabilities y usa iterm, kitty o sixel (en este orden); de lo contrario, escribe los bytes sin procesar de la imagen. |
SELECT toUInt8(x * 25) AS r, toUInt8(y * 25) AS g, toUInt8((x + y) * 12) AS b
FROM (SELECT number % 10 AS x, intDiv(number, 10) AS y FROM numbers(100))
FORMAT PNG
SETTINGS output_format_image_width = 10, output_format_image_height = 10, output_format_image_terminal_mode = 'auto';Configuración del formato
| Configuración | Descripción | Predeterminado |
|---|---|---|
output_format_image_width |
Ancho de la imagen de salida en píxeles. | 1024 |
output_format_image_height |
Altura de la imagen de salida en píxeles. | 1024 |
output_format_image_terminal_mode |
Protocolo de imagen de terminal en línea (ver arriba). | `` (vacío) |
output_format_image_time_multiplier_seconds |
Numerador de la unidad de tiempo de la columna t, en segundos. |
1 |
output_format_image_time_divisor_seconds |
Denominador de la unidad de tiempo de la columna t, en segundos. |
60 |
output_format_image_streaming_animation |
Escriba cada fotograma en cuanto avance t (ver arriba). |
0 |