Sie möchten wahrscheinlich die verwenden PPM-Format was Sie suchen: ein minimaler Header, gefolgt von rohem RGB.
Lassi
TARGA (Dateinamenerweiterung .tga) ist möglicherweise das einfachste weithin unterstützte binäre Bilddateiformat, wenn Sie keine Komprimierung und keine seiner Erweiterungen verwenden. Es ist sogar noch einfacher als Windows .bmp Dateien und wird von ImageMagick und vielen Zeichenprogrammen unterstützt. Es war mein bevorzugtes Format, wenn ich nur einige Pixel aus einem Wegwerfprogramm ausgeben musste.
Hier ist ein minimales C-Programm, um ein Bild für die Standardausgabe zu generieren:
Wann initialisieren Sie die Bytes an den Offsets 0, 1 und 3 bis 11 im tga-Array? Ist es dank des BSS-Linker-Abschnitts oder so etwas garantiert Null?
– Johan Boule
8. September 2019 um 1:44 Uhr
Gute Frage. Tatsächlich werden globale und statische Variablen garantiert von C mit Null initialisiert. Wenn Sie das Array von bekommen haben malloc() oder es auf dem Stack zuordnen, müssten Sie memset() manuell auf Null setzen (oder verwenden calloc() das macht das von alleine).
– Lassi
8. September 2019 um 9:31 Uhr
Ian D. Scott
Die kürzlich erstellt Farbfeld Format ist ziemlich minimal, obwohl es (zumindest bisher) nicht viel Software unterstützt.
Bytes │ Description
8 │ "farbfeld" magic value
4 │ 32-Bit BE unsigned integer (width)
4 │ 32-Bit BE unsigned integer (height)
(2+2+2+2)*width*height │ 4*16-Bit BE unsigned integers [RGBA] / pixel, row-major
mwfearnley
Hier ist ein minimales Beispiel, das Ihre Bilddatei mit einem minimalen PPM-Header schreibt. Glücklicherweise konnte ich es mit der genauen for-Schleife, die Sie bereitgestellt haben, zum Laufen bringen:
#include <math.h> // compile with gcc young.c -lm
#include <stdio.h>
#include <stdlib.h>
#define width 256
int main(){
int x, y, i; unsigned char raster_matrix[width*width], h[256][3];
#define WAVE(x,y) sin(sqrt( (x)*(x)+(y)*(y) ) * 30.0 / width)
#define hue(i) h[i]
/* Setup nice hue palette */
for (i = 0; i <= 85; i++){
h[i][0] = h[i+85][1] = h[i+170][2] = (i <= 42)? 255: 40+(85-i)*5;
h[i][1] = h[i+85][2] = h[i+170][0] = (i <= 42)? 40+i*5: 255;
h[i][2] = h[i+85][0] = h[i+170][1] = 40;
}
/* Setup Young's Interference image */
for (i = y = 0; y < width; y++) for (x = 0; x < width; x++)
raster_matrix[i++] = 128 + 64*(WAVE(x,y) + WAVE(x,width-y));
/* Open PPM File */
FILE *file = fopen("young.ppm", "wb"); if (!file) return -1;
/* Write PPM Header */
fprintf(file, "P6 %d %d %d\n", width, width, 255); /* width, height, maxval */
/* Write Image Data */
for (i=0; i < width*width; i++)
fwrite(hue(raster_matrix[i]), 1, 3, file);
/* Close PPM File */
fclose(file);
/* All done */
return 0;
}
Der Header-Code basiert auf den Spezifikationen unter http://netpbm.sourceforge.net/doc/ppm.html. Für dieses Bild ist der Header nur eine Zeichenfolge von fünfzehn Bytes: "P6 256 256 255\n".
14069300cookie-checkWas ist das einfachste RGB-Bildformat?yes