Netpbm (anteriormente Pbmplus) es un paquete de código abierto de programas gráficos y una biblioteca de programación. Se utiliza principalmente en el mundo Unix , donde se puede encontrar incluido en todas las principales distribuciones de sistemas operativos de código abierto , pero también funciona en Microsoft Windows , macOS y otros sistemas operativos. [3]
El proyecto Netpbm utiliza y define varios formatos gráficos:
Son formatos de archivos de imagen diseñados para ser intercambiados fácilmente entre plataformas. A veces también se los conoce colectivamente como formato de mapa portátil ( PNM ), [7] [8] que no debe confundirse con el formato de mapa arbitrario portátil (PAM) relacionado. El "número mágico" (Px) al comienzo de un archivo determina el tipo, no la extensión del archivo, aunque es una buena práctica usar la extensión correcta si es posible.
El formato PBM fue inventado por Jef Poskanzer en la década de 1980 como un formato que permitía transmitir mapas de bits monocromos dentro de un mensaje de correo electrónico como texto ASCII simple, lo que le permitía sobrevivir a cualquier cambio en el formato de texto. [8] Poskanzer desarrolló la primera biblioteca de herramientas para manejar el formato PBM, Pbmplus, lanzada en 1988. Contenía principalmente herramientas para convertir entre PBM y otros formatos gráficos. A fines de 1988, Poskanzer había desarrollado los formatos PGM y PPM junto con sus herramientas asociadas y los agregó a Pbmplus. El lanzamiento final de Pbmplus fue el 10 de diciembre de 1991.
En 1993, se desarrolló la biblioteca Netpbm para reemplazar a Pbmplus, que no recibía mantenimiento. Se trataba simplemente de un reempaquetado de Pbmplus con adiciones y correcciones enviadas por personas de todo el mundo. [1]
Cada archivo comienza con un número mágico de dos bytes (en ASCII) que identifica el tipo de archivo del que se trata (PBM, PGM y PPM) y su codificación ( ASCII /"normal" o binario/"sin formato"). El número mágico es una P mayúscula seguida de un número de un solo dígito.
Un valor de P7
hace referencia al formato de archivo PAM que también está cubierto por la biblioteca netpbm. [9]
Los formatos ASCII ("simples") permiten la lectura humana y una fácil transferencia a otras plataformas; los formatos binarios ("sin procesar") son más fáciles de analizar por los programas y más eficientes en cuanto al tamaño de archivo.
En los formatos binarios, PBM utiliza 1 bit por píxel, PGM utiliza 8 o 16 bits por píxel y PPM utiliza 24 o 48 bits por píxel: 8/16 para rojo, 8/16 para verde, 8/16 para azul. El soporte de aplicaciones para las variantes de 16 bits aún es poco frecuente.
La documentación de PGM y PPM define que los valores de gris y color utilizan el espacio de color BT.709 y la función de transferencia gamma . Sin embargo, según la aplicación, el espacio de color utilizado puede ser sRGB , lineal o algún otro espacio de color . No hay metadatos en el archivo que indiquen qué espacio de color se está utilizando.
A continuación se muestra un ejemplo sencillo del formato PBM (no se muestran los caracteres de nueva línea al final de cada línea):
P1# Este es un ejemplo de mapa de bits de la letra "J"6 100 0 0 0 1 00 0 0 0 1 00 0 0 0 1 00 0 0 0 1 00 0 0 0 1 00 0 0 0 1 01 0 0 0 1 00 1 1 1 0 00 0 0 0 0 00 0 0 0 0 0
La cadena P1 identifica el formato del archivo. El signo numérico introduce un comentario. Los dos números siguientes indican el ancho y la altura. A continuación, aparece la matriz con los valores de los píxeles (en el caso monocromático, solo ceros y unos).
No es necesario que los píxeles estén bien alineados; el formato ignora los espacios en blanco y los saltos de línea en la sección de datos, aunque se recomienda que ninguna línea tenga más de 76 caracteres. A continuación se muestra la misma imagen:
P1# Este es un ejemplo de mapa de bits de la letra "J"6 10000010000010000010000010000010000010100010011100000000000000
Aquí está la imagen resultante:
Aquí está nuevamente ampliado 20 veces:
Un valor de 0 significa un píxel blanco y un 1 significa un píxel negro. Esto difiere de los otros formatos, donde los valores más altos significan píxeles más brillantes.
El formato binario P4 de la misma imagen representa cada píxel con un solo bit. Una fila tiene un ancho de píxeles empaquetado en una longitud de 8 píxeles o un byte. El primer píxel de una fila es el bit más significativo. Los bits adicionales utilizados para que la longitud sea igual a un byte se ignoran. La siguiente fórmula se puede utilizar para calcular la cantidad de bytes necesarios ⌈ ancho / 8⌉ * alto . Si usamos el ejemplo anterior, ⌈6 / 8⌉ * 10 serían 10 bytes.
P4# Este es un ejemplo de formato binario de la letra "J" con cada byte en notación decimal6 108 8 8 8 8 8 136 112 0 0
Los formatos PGM y PPM (tanto las versiones ASCII como binarias) tienen un parámetro adicional para el valor máximo (número de grises entre el negro y el blanco) después de las dimensiones X e Y y antes de los datos de píxeles reales. El negro es 0 y el valor máximo es blanco. (No se muestran los caracteres de nueva línea al final de cada línea).
P2# Muestra la palabra "FEEP"24 horas, 7 días a la semana150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 00 3 0 0 0 0 0 7 0 0 0 0 0 0 11 0 0 0 0 0 0 15 0 0 15 00 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 00 3 0 0 0 0 0 7 0 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 00 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Este es un ejemplo de una imagen RGB en color almacenada en formato PPM. (No se muestran los caracteres de nueva línea al final de cada línea).
P3# "P3" significa que esta es una imagen en color RGB en ASCII# "3 2" es el ancho y alto de la imagen en píxeles# "255" es el valor máximo para cada color# Esto, hasta la línea "255" a continuación, está el encabezado.# Todo lo que viene después son datos de la imagen: tripletes RGB.# En orden: rojo, verde, azul, amarillo, blanco y negro.3 2255255 0 0 0 255 0 0 0 255255 255 0255 255 255 0 0 0
El formato binario P6 de la misma imagen representa cada componente de color de cada píxel con un byte (es decir, tres bytes por píxel) en el orden rojo, verde y azul. El archivo es más pequeño, pero la información de color es más difícil de leer para los humanos. El encabezado permanece en ASCII y los argumentos siguen estando separados por un espacio en blanco. La información de la imagen binaria aparece después del encabezado (que termina con un espacio en blanco).
En el formato binario, la última línea de encabezado debe ser como "255\n", con los datos inmediatamente después; cualquier comentario agregado después de 255 se tomará como el inicio de los datos de la imagen, y la imagen se inclinará hacia la derecha (al menos cuando se abra con el programa de manipulación de imágenes GIMP (diciembre de 2022)).
El formato PPM no está comprimido y, por lo tanto, requiere más espacio y ancho de banda que un formato comprimido. Por ejemplo, la imagen PNG ( Portable Network Graphics ) de 192×128 anterior tiene un tamaño de archivo de 166 bytes. Cuando se convierte a una imagen PPM de 192×128, el tamaño del archivo es de 73.848 bytes. El factor de reducción de tamaño de archivo de aproximadamente 100 al convertir a png es típico si la imagen es un dibujo lineal; si la imagen es una foto, es mejor convertirla a jpeg, que produce una mayor reducción de tamaño de archivo.
El formato PPM es generalmente un formato intermedio utilizado para trabajar con imágenes antes de convertir a un formato más eficiente, por ejemplo el formato PNG, sin ninguna pérdida de información en el paso intermedio.
La imagen que se muestra arriba usando solo 0 o el valor máximo para los canales rojo- verde - azul también se puede codificar como:
P3# La misma imagen con ancho 3 y alto 2,# usando 0 o 1 por color (rojo, verde, azul)3 2 11 0 0 0 1 0 0 0 11 1 0 1 1 1 0 0 0
El espacio en blanco, incluidos los finales de línea y las líneas de comentarios, es sintácticamente equivalente a un espacio simple dentro de los encabezados PNM. Para los formatos simples P1...P3, esto también afecta a las líneas de mapa de bits; de hecho, las líneas deberían limitarse a 70 caracteres:
P3 3 2 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0
La definición original de los formatos binarios PGM y PPM (los formatos P5 y P6) no permitía profundidades de bits mayores que 8 bits. Si bien el formato ASCII puede admitir mayores profundidades de bits, aumenta el tamaño del archivo y, por lo tanto, ralentiza las operaciones de lectura y escritura. En consecuencia, muchos programadores ampliaron el formato para permitir mayores profundidades de bits. El uso de mayores profundidades de bits enfrenta el problema de tener que decidir sobre el orden de bytes del archivo. Las diversas implementaciones no se pusieron de acuerdo sobre qué orden de bytes utilizar, y algunas relacionaron el orden de bytes de 16 bits con el orden de empaquetamiento de píxeles. [10] La documentación actual de PGM y PPM dice que el byte más significativo es el primero y la implementación de Netpbm también utiliza el orden de bytes big-endian. [11]
PFM (Portable Floatmap) es la extensión de punto flotante de precisión simple IEEE 754 de cuatro bytes no oficial. [12] [13] [14]
Después del encabezado, el archivo continúa con números de punto flotante para cada píxel, especificados en orden de izquierda a derecha y de abajo a arriba. Algunos programas sugieren PF4 como una extensión adicional para el formato RGBA. [15]
PFM es compatible con los programas Photoshop , [16] GIMP e ImageMagick . Es compatible con la implementación de referencia de facto netpbm. [12]
El paquete Netpbm contiene más de 350 programas, [17] la mayoría de los cuales tienen "pbm", "pgm", "ppm", "pam" o "pnm" en sus nombres. Por ejemplo, se puede usar pamscale
para reducir una imagen en un 10%, pamcomp
para superponer una imagen sobre otra, pbmtext
para crear una imagen de texto o para reducir la cantidad de colores de una imagen con pnmquant
.
Los programas están diseñados para ser bloques de construcción mínimos que se pueden utilizar en diversas combinaciones para hacer otras cosas. El paquete Netpbm puede, por ejemplo, utilizar dos programas de conversión sucesivos para convertir una imagen en color en formato GIF en un archivo .bmp :
regalopnm alguna foto.gif > alguna foto.ppmppmtobmp algunaimagen.ppm > algunaimagen.bmp
Esto se hace más comúnmente como una canalización , para ahorrar tiempo de ejecución y evitar dejar un archivo somepic.ppm temporal:
regaloopnm alguna foto.gif | ppmtobmp > alguna foto.bmp
Los programas Netpbm se utilizan frecuentemente como intermediarios para convertir entre formatos poco conocidos. Por ejemplo, puede que no exista ninguna herramienta para convertir un volcado de ventana X11 ( formato XWD ) directamente a un archivo PICT de Macintosh , pero se puede hacer esto ejecutando xwdtopnm
, y luego ppmtopict
. (Las herramientas que dicen que generan PNM generan PBM, PGM o PPM. Las herramientas que importan PNM leerán cualquiera de los tres formatos). Como ejemplo más complejo, las herramientas Netpbm pueden convertir XBM de 48×48 a Ikon y, finalmente, a X-Face . [18]
El formato PBM (blanco y negro) fue inventado por Jef Poskanzer a mediados de la década de 1980. En ese momento, no existía una forma estándar y confiable de enviar archivos binarios por correo electrónico, e intentar enviar cualquier cosa que no fuera ASCII de 7 bits por correo electrónico a menudo resultaba en corrupción de datos . PBM fue diseñado para permitir que las imágenes se enviaran por correo electrónico sin que se corrompieran. Poskanzer lanzó el precursor de Netpbm, llamado Pbmplus en 1988. A fines de 1988, Poskanzer había desarrollado los formatos PGM (escala de grises) y PPM (color) y los lanzó con Pbmplus.
El último lanzamiento de Pbmplus fue el 10 de diciembre de 1991. Poskanzer nunca lanzó más actualizaciones y, en 1993, se desarrolló Netpbm para reemplazarlo. Al principio, no era más que una versión renombrada de Pbmplus, pero las actualizaciones continuaron hasta 1995, cuando el paquete volvió a ser abandonado. En 1999, el paquete Netpbm fue retomado por su actual mantenedor, Bryan Henderson.
En 2000, se agregó PAM a los formatos de archivo de la biblioteca Netpbm, lo que permitió un canal alfa. [19]
El nombre Netpbm proviene de la colaboración entre los desarrolladores de programas a través de Internet , algo que era muy conocido en ese momento; el sistema operativo NetBSD y el juego NetHack recibieron nombres similares. (A diferencia del formato Portable Network Graphics (PNG) posterior y más extendido, la "red" en el nombre no hace referencia a la optimización de la imagen para su transferencia a través de una red).
Portable Arbitrary Map ( PAM ) es una extensión de los antiguos formatos gráficos binarios P4...P6 , introducidos con la versión 9.7 de netpbm (agosto de 2000). PAM generaliza todas las características de PBM, PGM y PPM, y permite extensiones. PAM define dos nuevos atributos: profundidad y tipo de tupla :
PAM es compatible con XnView y FFmpeg . [21] [22] Como se especifica TUPLTYPE
, es opcional; sin embargo, FFmpeg lo requiere.
El encabezado del formato de archivo PAM comienza con P7 y (a diferencia de los otros formatos) termina con un cierre explícito: "ENDHDR" seguido de un espacio en blanco. Los finales de línea en un encabezado PAM son significativos; para PNM, los finales de línea son espacios en blanco.
No existe una versión simple (legible para humanos, basada en ASCII ) de PAM. Los archivos PAM son siempre binarios y los intentos de usar el conmutador -plain
con programas Netpbm que producen salida PAM dan como resultado un mensaje de error.
Para la versión en blanco y negro de PAM (profundidad 1, tipo de tupla BLACKANDWHITE), correspondiente a PBM, PAM utiliza un byte por píxel, en lugar de un bit por píxel como en PBM (ocho píxeles en un byte). Además, el valor 1 en una imagen PAM de este tipo representa el blanco ("luz encendida"), a diferencia del negro en PBM ("tinta encendida").
Todos los tipos de tuplas básicos (BLANCO Y NEGRO, ESCALA DE GRISES y RGB) tienen una variante con un canal de opacidad . El tipo de tupla se crea añadiendo "_ALPHA" como sufijo al tipo de tupla base.
Por ejemplo, una imagen con un tipo de tupla GRAYSCALE es equivalente a PGM (mapa de grises portátil). GRAYSCALE_ALPHA con transparencia no es directamente posible en PGM. La especificación permite MAXVAL 1 para GRAYSCALE, pero tendría el mismo efecto que BLACKANDWHITE.
Un ejemplo en el artículo BMP muestra una imagen RGBA con 4×2=8 píxeles de color azul, verde, rojo y blanco; semitransparente (0x7F) en la primera fila inferior, opaca (0xFF) en la segunda fila superior; hexadecimal FF00007F 00FF007F 0000FF7F FFFFFF7F FF0000FF 00FF00FF 0000FFFF FFFFFFFF
en orden BGRA . Para PAM, este mapa de bits debe proporcionarse en orden RGBA , intercambiando el primer y tercer byte en cada píxel. Las filas BMP suelen estar dispuestas de abajo a arriba, mientras que para PAM y PNM las filas se proporcionan de arriba a abajo (es decir, para este ejemplo 0000FFFF 00FF00FF FF0000FF FFFFFFFF 0000FF7F 00FF007F FF00007F FFFFFF7F
). El encabezado PAM para este ejemplo podría ser:
P7ANCHO 4ALTURA 2PROFUNDIDAD 4Valor máximo 255TIPO TUPL RGB_ALFAENDHDR
El mecanismo de tipo tupla de PAM permite muchas extensiones. En teoría, PAM se puede ampliar para representar modelos de color como CMYK.
El formato no se limita a los gráficos, su definición permite su uso para matrices tridimensionales arbitrarias de números enteros sin signo. Algunos programas del paquete Netpbm, por ejemplo pamsummcol , funcionan como procesadores aritméticos de matrices rudimentarios y utilizan el formato PAM de esta manera.
Netpbm consta de cientos de herramientas diferentes, cada una de las cuales se ofrece con una licencia de copyright pública propia. Un análisis realizado por el desarrollador de Debian Steve McIntyre en 2001 sugiere que la mayoría de las licencias son de software libre, una licencia no comercial (que no es libre) y una docena sin licencia ofrecida (que tampoco es libre). Como se menciona en el análisis, obviamente no cubre los cambios realizados desde entonces. [23]
Se agregó el formato PAM