存bmp图片函数

#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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值