permite - ¿Cuál es el formato de imagen RGB más simple?
png o jpg para fotos (3)
Estoy trabajando en C en un experimento de física, el experimento de interferencia de Young e hice un programa que imprime para file
una gran cantidad de píxeles:
for (i=0; i < width*width; i++)
{
fwrite(hue(raster_matrix[i]), 1, 3, file);
}
Donde hue
, cuando se le da un valor [0..255], devuelve un char *
con 3 bytes, R, G, B.
Me gustaría poner un encabezado mínimo en mi archivo de imagen para hacer de este archivo en bruto un archivo de imagen válido .
Más conciso: Cambio de:
offset
0000 : height * width : data } my data, 24bit RGB pixels
a
offset
0000 : dword : magic /
: /* ?? */ /
0012 : dword : height } Header <--> common image file
0016 : dword : width /
: /* ?? */ /
0040 : height * width : data } my data, 24bit RGB pixels
Gracias.
El formato farbfeld recientemente creado es bastante mínimo, aunque no hay mucho software que lo soporte (al menos hasta ahora).
Probablemente desee utilizar el formato PPM, que es lo que está buscando: un encabezado mínimo seguido de RGB sin formato .
TARGA (extensión de nombre de archivo .tga
) puede ser el formato de archivo de imagen binario más ampliamente compatible si no usa compresión y no utiliza ninguna de sus extensiones. Es incluso más simple que los archivos .bmp
Windows y es compatible con ImageMagick y muchos programas de pintura. Ha sido mi formato de acceso cuando solo necesito enviar algunos píxeles desde un programa desechable.
Aquí hay un programa de C mínimo para generar una imagen a la salida estándar:
#include <stdio.h>
#include <string.h>
enum { width = 550, height = 400 };
int main(void) {
static unsigned char pixels[width * height * 3];
static unsigned char tga[18];
unsigned char *p;
size_t x, y;
p = pixels;
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
*p++ = 255 * ((float)y / height);
*p++ = 255 * ((float)x / width);
*p++ = 255 * ((float)y / height);
}
}
tga[2] = 2;
tga[12] = 255 & width;
tga[13] = 255 & (width >> 8);
tga[14] = 255 & height;
tga[15] = 255 & (height >> 8);
tga[16] = 24;
tga[17] = 32;
return !((1 == fwrite(tga, sizeof(tga), 1, stdout)) &&
(1 == fwrite(pixels, sizeof(pixels), 1, stdout)));
}