Pers.narod.ru. Алгоритмы. Создаём файлы BMP на Си |
В приведённом ниже листинге (процедурный Си) генерируются файлы в формате BMP 24 бита, например, такие:
Листинг подробно закомментирован, в него включены также несколько альтернативных вариантов градиентов (функции Func
, White2Black
).
#include <stdio.h> #include <malloc.h> struct BitMapFile { int bfType; //Метка BM long bfSize; //Длина в байтах long Res; //Резерв long bfOffs; //Смещение области данных //Начало BITMAP_INFO: long biSize; //Длина BITMAP_INFO long biWidth, biHeight;//Ширина и высота картинки int biPlanes; //Число плоскостей int biBitCnt; //Бит на пиксел long biCompr; //Тип сжатия long biSizeIm; //Размер изображения в байтах long biXPels,biYPels; //Разрешение по горизонтали и вертикали long biClrUsed; //Количество используемых цветов long biClrImp; //Количество основных цветов }; // Дальше идут байты в виде BB GG RR по строкам слева направо, // но снизу вверх void InitDefaults (BitMapFile *b) { b->bfType=0x4d42; b->Res=0; b->bfOffs=54; b->biSize=40; b->biPlanes=1; b->biBitCnt=24; b->biCompr=0; b->biXPels=4730; b->biYPels=4720; b->biClrUsed=0; b->biClrImp=0; } void Func (char far *Img) { //От золотого FFCC00 до FFFFFF int i,j,k,all; char r,g,b; for (k=0; k<23; k++) { //Делаем одну строку: r=255; g=204; b=0; all=0; do { if (g<255) g++; for (j=0; j<5; j++) { if (b<255) b++; *Img++=b; *Img++=g; *Img++=r; all++; if (all==512) goto END; } } while (1); END: } } /* void Func (char far *Img) { //От FFFFCC до 000080, 16 строк, длина строки 512 int i,j,k,all; char r,g,b; for (k=0; k<23; k++) { //Делаем одну строку: r=256; g=256; b=204; all=0; do { r--; g--; for (j=0; j<2; j++) { *Img++=b; *Img++=g; *Img++=r; all++; if (all==512) goto END; } r--; g--; for (j=0; j<2; j++) { *Img++=b; *Img++=g; *Img++=r; all++; if (all==512) goto END;} r--; g--; for (j=0; j<2; j++) { *Img++=b; *Img++=g; *Img++=r; all++; if (all==512) goto END;} b--; } while (1); END: } } */ /* void White2Black (char far *Img) { //Черный-синий-белый-синий-черный, размеры 1200 на 10 int i,j,k; char r,g,b; for (k=0; k<10; k++) { //Делаем одну строку: for (i=0; i<=255; i++) { b=i; g=0; r=0; *Img++=b; *Img++=g; *Img++=r; } for (i=0; i<=255; i++) { b=255; g=i; r=i; *Img++=b; *Img++=g; *Img++=r; } for (i=0; i<176; i++) { b=g=r=255; *Img++=b; *Img++=g; *Img++=r; } for (i=255; i>=0; i--) { b=255; g=i; r=i; *Img++=b; *Img++=g; *Img++=r; } for (i=255; i>=0; i--) { b=i; g=0; r=0; *Img++=b; *Img++=g; *Img++=r; } } } */ /* void White2Black (char far *Img) { //От белого через синий к черному, размеры д.б. 800 на 10 int i,j,k; char r,g,b; for (k=0; k<10; k++) { //Делаем 1 строку: for (j=0; j<240; j++) { b=g=r=255; *Img++=b; *Img++=g; *Img++=r; } for (i=255; i>=0; i--) { b=255; g=i; r=i; *Img++=b; *Img++=g; *Img++=r; } for (i=255; i>=0; i--) { b=i; g=0; r=0; *Img++=b; *Img++=g; *Img++=r; } for (j=0; j<48; j++) { b=g=r=0; *Img++=b; *Img++=g; *Img++=r; } } } */ int main (void) { FILE *w,*r; char far *Image; BitMapFile b; w=fopen ("!my.bmp","wb"); if (w==NULL) { printf ("\n Can't open the file!"); return 1; } InitDefaults (&b); //Выбираем размеры картинки! b.biWidth=512; b.biHeight=23; long Size= b.biWidth * b.biHeight * 3; //Размер изображения Image= (char far *) malloc (Size); // Добавляем длину заголовка Size+=54; b.bfSize=Size; //Здесь - вызов ф-ции White2Black или другой Func (Image); fwrite (&b,54,1,w); fwrite (Image,Size,1,w); fclose (w); return 0; }
Вывод пишется в файл !my.bmp
, графический режим для запуска не нужен.
гостевая; E-mail |