#ifndef IMAGE_METHOD_H
#define IMAGE_METHOD_H
#pragma pack()
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef long LONG;
typedef char *LPSTR;
#define BI_RGB 0L
#pragma pack(1)
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
#pragma pack(2)
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
#pragma pack(1)
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
#pragma pack()
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)
typedef unsigned int HLOCAL;
typedef struct tagPALETTEENTRY {
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY;
#pragma pack()
#endif
char bmpfilename[]="first.bmp";
CreateBmp(newImgData, bmpfilename,720,288,24)
int CreateBmp(BYTE * color, char *FileName,long width, long height,DWORD BitCount)
{ //创建bmp图像BITMAPFILEHEADER bff;
BITMAPINFOHEADER bii;
//HLOCAL hPal;
PALETTEENTRY *pPal;
FILE* hf;
int i,j,m,n,number_color;
BYTE *tempgray,*tempgray1;
long pointwidth = 0;
if(BitCount==8)
{
number_color=256;
pointwidth = width;
}
else if(BitCount==16)
{
number_color=2;
pointwidth = (width+7)/8;
}
else if(BitCount==24)
{
number_color=0;
pointwidth = (int)width*3;
}
else
{
// AfxMessageBox("暂时不能创建这种位数的位图 *_*");
return 0;
}
int BmpWidth=WIDTHBYTES(BitCount *(int)width);
// int dd = sizeof(color);
tempgray= (BYTE*)malloc(BmpWidth*(int)height);
tempgray1= (BYTE*)malloc(BmpWidth*(int)height);
memset(tempgray,0,sizeof(BYTE)*BmpWidth*(int)height);
memset(tempgray1,0,sizeof(BYTE)*BmpWidth*(int)height);
for(i=0;i<height;i++)
{
for(j=0;j<BmpWidth;j++)
{
m=i*BmpWidth+j;
n=i*pointwidth+j;
if(j<pointwidth)
tempgray[m]=color[n];
else
tempgray[m] = 0;
}
}
for(i=0;i<height;i++)
{
for(j=0;j<BmpWidth;j++)
{
tempgray1[i*BmpWidth+j] = tempgray[(height-i-1)*BmpWidth +j];
}
}
bff.bfType = 0x4d42;
bff.bfReserved1 = 0;
bff.bfReserved2 = 0;
bff.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + number_color * sizeof(RGBQUAD));
bff.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER)
+ BmpWidth*(int)height + number_color* sizeof(PALETTEENTRY));
bii.biSize = sizeof(BITMAPINFOHEADER);
bii.biWidth = width;
bii.biHeight = height;
bii.biCompression = BI_RGB;
bii.biPlanes = 1;
bii.biBitCount = (WORD)BitCount;
// bii.biSizeImage = (DWORD)bii.biWidth*bii.biHeight;
bii.biSizeImage = BmpWidth*bii.biHeight;
bii.biClrImportant = 0;
bii.biClrUsed = number_color;
bii.biXPelsPerMeter=0;
bii.biYPelsPerMeter=0;
pPal=(PALETTEENTRY *)malloc( number_color * sizeof(PALETTEENTRY));
if(bii.biBitCount==8)
{
for (i = 0; i < 256; i++)
{
pPal[i].peRed=(BYTE) i;//lpRGB->rgbRed;
pPal[i].peGreen=(BYTE) i;//lpRGB->rgbGreen;
pPal[i].peBlue=(BYTE) i;//lpRGB->rgbBlue;
pPal[i].peFlags=(BYTE)0;
}
}
if(bii.biBitCount==1)
{
//设置调色板
pPal[0].peRed=(BYTE) 0;//lpRGB->rgbRed;
pPal[0].peGreen=(BYTE) 0;//lpRGB->rgbGreen;
pPal[0].peBlue=(BYTE) 0;//lpRGB->rgbBlue;
pPal[0].peFlags=(BYTE)0;
pPal[1].peRed=(BYTE) 255;//lpRGB->rgbRed;
pPal[1].peGreen=(BYTE) 255;//lpRGB->rgbGreen;
pPal[1].peBlue=(BYTE) 255;//lpRGB->rgbBlue;
pPal[1].peFlags=(BYTE)0;
}
//fprintf(stderr, "biSize=%d, biCompression=%d, BITMAPFILEHEADER=%d, BITMAPINFOHEADER=%d\n",
// bii.biSize, bii.biCompression, sizeof(BITMAPFILEHEADER), sizeof(BITMAPINFOHEADER));
//fflush(stderr);
hf=fopen(FileName,"wb");
//fseek(hf,0,SEEK_SET);
fwrite((LPSTR)&bff,1,sizeof(BITMAPFILEHEADER),hf);
fwrite((LPSTR)&bii,1,sizeof(BITMAPINFOHEADER),hf);
if((bii.biBitCount!=24)||(bii.biBitCount!=16))
fwrite((LPSTR)&pPal[0],1,sizeof(PALETTEENTRY)*number_color,hf);
fwrite((LPSTR)tempgray,1,BmpWidth*height,hf);
fclose(hf);
if( tempgray)
{
free(tempgray);
tempgray = NULL;
}
if( tempgray1)
{
free(tempgray1);
tempgray1 = NULL;
}
return 1;
}