Нашёл тут у себя один исходничек. Может поможет:
| Код | #include <iostream.h> #include <conio.h> #include <stdio.h> #include <process.h> #include <mem.h>
#define BI_RGB 0 // компрессия отсутствует #define BI_RLE8 1 // компрессия (для одного пиксела - 8 бит) #define BI_RLE4 2 // компрессия (для одного пиксела - 4 бита) #define BI_BITFIELDS 3 // компрессия (другой формат компрессии)
typedef unsigned long UINT; typedef unsigned long DWORD; typedef unsigned int WORD; typedef unsigned long LONG; typedef unsigned char BYTE; ////////////////////////////////////////////////////////////////////////// // typedef struct tagBITMAPFILEHEADER { UINT bfType; // тип файла (0x4D42) DWORD bfSize; // размер файла BYTE bfReserved1; BYTE bfReserved2; DWORD bfOffBits; // смещение битов изображения }BITMAPFILEHEADER; typedef BITMAPFILEHEADER* PBITMAPFILEHEADER; typedef BITMAPFILEHEADER far* LPBITMAPFILEHEADER;
////////////////////////////////////////////////////////////////////////// // typedef struct tagBITMAPINFOHEADER { DWORD biSize; // размер структуры BITMAPFILEHEADER LONG biWidth; // ширина изображения в пикселах LONG biHeight; // высота изображения в пикселах WORD biPlanes; // количество плоскостей WORD biBitCount; // количество бит на пиксел DWORD biCompression; // тип сжатия DWORD biSizeImage; // размер изображения в байтах LONG biXPelsPerMeter; // разрешение устройства вывода по X LONG biYPelsPerMeter; // разрешение устройства вывода по Y DWORD biClrUsed; // размер таблицы цветов DWORD biClrImportant; // необходимое количество цветов }BITMAPINFOHEADER; typedef BITMAPINFOHEADER* PBITMAPINFOHEADER; typedef BITMAPINFOHEADER far* LPBITMAPINFOHEADER;
////////////////////////////////////////////////////////////////////////// // typedef struct tagRGBTRIPLE { BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; }RGBTRIPLE; typedef RGBTRIPLE far* LPRGBTRIPLE;
////////////////////////////////////////////////////////////////////////// // void main() { BITMAPFILEHEADER BitmapFileHeader; BITMAPINFOHEADER BitmapInfoHeader; RGBTRIPLE Rgb; BYTE buf; LONG Width; LONG Height; int i, j, k;
buf = 0; Width = 150; Height = 300; clrscr();
memset(&BitmapFileHeader, 0, sizeof(BITMAPFILEHEADER)); BitmapFileHeader.bfType = 0x4D42; // тип файла (текстовая строка "BM") BitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
memset(&BitmapInfoHeader, 0, sizeof(BITMAPINFOHEADER)); BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER); BitmapInfoHeader.biHeight = Height; BitmapInfoHeader.biWidth = Width; BitmapInfoHeader.biPlanes = 1; BitmapInfoHeader.biBitCount = sizeof(RGBTRIPLE)*8;
FILE *stream; stream = fopen("a.bmp", "wb"); if(stream == NULL) { cout << "Ошибка открытия файла для записи" << endl; exit(1); }
fwrite(&BitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, stream); fwrite(&BitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, stream);
// "рисуем" красный прямоугольник Rgb.rgbtBlue = 0; Rgb.rgbtGreen = 0; Rgb.rgbtRed = 255;
for(i = 0; i<Height/2; i++) { for(j = 0; j<Width; j++) fwrite(&Rgb, sizeof(RGBTRIPLE), 1, stream);
// каждая строка изображения - кратна 4 байтам if(Width%4 == 0) continue; for(k=0; k<4; k++) { fwrite(&buf, sizeof(BYTE), 1, stream); if((Width+k+1)%4 == 0) break; } }
// "рисуем" синий прямоугольник Rgb.rgbtBlue = 255; Rgb.rgbtGreen = 0; Rgb.rgbtRed = 0;
for(i = 0; i<Height/2; i++) { for(j = 0; j<Width; j++) fwrite(&Rgb, sizeof(RGBTRIPLE), 1, stream); if(Width%4 == 0) continue; for(k=0; k<4; k++) { fwrite(&buf, sizeof(BYTE), 1, stream); if((Widthэ)%4 == 0) break; } } if(Width%4 != 0) for(k=0; k<4; k++) { fwrite(&buf, sizeof(BYTE), 1, stream); if((Widthэ)%4 == 0) break; }
fclose(stream); getch(); }
|
|