Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short int word;
typedef unsigned int dword;
#pragma pack(push)
#pragma pack(1)
struct BitMapHeader
{
word bfType; // тип файла, для BMP - BM
dword bfSize; // размер файла - dword (истинный размер 34342-1078+14)
word bfReserved1; // не используется
word bfReserved2; // не используется
dword bfOffbits; // смещение данных битового образа от заголовка в байтах (1078)
// Далее идет структура BITMAPINFOHEADER
dword biSize ; // число байт, занимаемых структурой BITMAPINFOHEADER
dword biWidth; // ширина витового образа в пикселях
dword biHeight; // высота битового образа в пикселях
word biPlanes; // число битовых плоскостей устройства
word biBitCount; // число битов на пиксель
dword biCompression; // тип сжатия
dword biSizeImage; // размер картинки в байтах (без 1078 т.е.33264)
dword biXPelPerMeter; // горизонтальное разрешение устройства, пиксель/м
dword biYPelPerMeter; // вертикальное разрешение устройства, пиксель/м
dword biClrUsed; // число используемых цветов
dword biClrImportant; // число "важных" цветов
};
typedef unsigned char BYTE;
#pragma pack(pop)
struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} ;
BitMapHeader ReadHeader(FILE * f);
void ReadQuad(tagRGBQUAD* RGB,int biSize,FILE *f);
void WriteQuad(tagRGBQUAD* RGB,int biSize,FILE *f);
int poisk(tagRGBQUAD* RGB,int r,int g,int b);
int main(int argc, char* argv[])
{
BitMapHeader header;
tagRGBQUAD RGBQuad[256];
FILE* fb;
char filename[]="1.bmp";
if(!(fb=fopen(filename,"r+b"))){printf("file not open");return 1;}
// заголовок
header=ReadHeader(fb);
// палитра
ReadQuad(RGBQuad,header.biSize+14,fb);
int n;
int m;
n=header.biHeight;
m=header.biWidth;
RGBQuad[5].rgbRed = 255; RGBQuad[5].rgbGreen = 0; RGBQuad[5].rgbBlue = 0; RGBQuad[5].rgbReserved = 0;
int red = 5;
int blue = poisk(RGBQuad, 0, 0, 255);
BYTE **a;
a=new BYTE*[n];
for(int i=0;i<n;i++)
{
a[i]=new BYTE[m];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if (i > n/2-8-1 && i < n/2+8 && j > n/2-8-1 && j < n/2+8)
a[i][j] = red;
else
a[i][j] = blue;
}
}
fseek(fb,header.bfOffbits,SEEK_SET);
for(int i=0;i<n;i++){
fwrite(a[i],m,1,fb);
}
delete[]a;
WriteQuad(RGBQuad,header.biSize+14,fb);
fclose(fb);
return 0;
}
BitMapHeader ReadHeader(FILE * f)
{
BitMapHeader h;
int numread;
fseek(f,0,SEEK_SET);
if(!(numread=fread((char*)&h,sizeof(BitMapHeader),1,f)))exit(1);
return h;
}
void ReadQuad(tagRGBQUAD* RGB,int biSize,FILE *f)
{
fseek(f,biSize,SEEK_SET);
fread(RGB,1024,1,f);
}
void WriteQuad(tagRGBQUAD* RGB,int biSize,FILE *f)
{
fseek(f,biSize,SEEK_SET);
fwrite(RGB,1024,1,f);
}
int poisk(tagRGBQUAD*RGBQuad,int r,int g,int b)
{
for(int i=0;i<256;i++)
if(RGBQuad[i].rgbRed == r && RGBQuad[i].rgbGreen==g && RGBQuad[i].rgbBlue == b)
return i;
}