首先我本先了解一下BMP圖片的格式。
BMP文件主要分爲如下4個部分:
塊名稱 對應Windows結構體定義 大小(Byte)
文件信息頭 BITMAPFILEHEADER 14
位圖信息頭 BITMAPINFOHEADER 40
顏色表(調色板)RGBQUAD (可選)
位圖數據(RGB顏色陣列) BYTE* 由圖像長寬尺寸決定
第3~5位:代表文件大小。如00010436h = 66614 B = 65.05 kB
第6~9位:保留段,爲0。
第A~D位:即從文件頭到位圖數據需偏移字節數。
共14字節。
0E~11:00000028h = 40,這個位圖信息頭的大小爲40個字節。
12~15:圖片寬度。(像素)
16~19:圖片高度。(像素)
1A~1B:0001h。
1C~1D:0008h,代表每個像素佔8比特。
1E~21:00000000h,代表圖像不壓縮。
22-25:00000000h。
26-29:00000000h。
2A-2D:00000000h。
2E-31:00000100h=256,說明本位圖實際使用的顏色索引數爲256。
32-35:00000100h=256,說明本位圖重要的顏色索引數爲256。
位圖數據(RGB顏色陣列)就是我們給入的圖像陣列,本程序是從ASC16點陣字庫中取得。
注意:linux漢字使用的是utf-8,如果從HZK16點陣字庫中取得漢字陣列需要轉化成GB2321碼,本文不做講解。
注:
<span style="font-size:18px;"><strong>int GenBmpFile(char *pData, char bitCountPerPix, int width, int height, const char *filename) <code class="cpp comments">生成BMP圖片</code>函數以及對應的結構體是從</strong></span>
http://www.cnblogs.com/shengansong/archive/2011/09/23/2186409.html摘抄而來,具體可轉此連接查看。
<span style="font-size:18px;"><strong>PutBMP(FILE *fp16,char *str) 函數是將數組中的數字的ASCII碼乘以16獲取數字在字庫中的區位碼,獲取改數字的陣列,賦值給RGB結構體,最後通過GenBmpFile()函數生成對應數字的bmp圖片。</strong></span>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma pack(push, 1)
typedef struct tagBITMAPFILEHEADER
{
short bfType;
int bfSize;
short bfReserved1;
short bfReserved2;
int bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
int biSize;
int biWidth;
int biHeight;
short biPlanes;
short biBitCount;
int biCompression;
int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
int biClrUsed;
int biClrImportant;
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD
{
char rgbBlue;
char rgbGreen;
char rgbRed;
char rgbReserved;
} RGBQUAD;
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
typedef struct tagBITMAP
{
BITMAPFILEHEADER bfHeader;
BITMAPINFO biInfo;
}BITMAPFILE;
#pragma pack(pop)
int GenBmpFile(char *pData, char bitCountPerPix, int width, int height, const char *filename)
{
FILE *fp = fopen(filename, "wb");
if(!fp)
{
printf("fopen failed : %s, %d\n", __FILE__, __LINE__);
return 0;
}
int bmppitch = ((width*bitCountPerPix + 31) >> 5) << 2;
int filesize = bmppitch*height;
BITMAPFILE bmpfile;
bmpfile.bfHeader.bfType = 0x4D42;
bmpfile.bfHeader.bfSize = filesize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpfile.bfHeader.bfReserved1 = 0;
bmpfile.bfHeader.bfReserved2 = 0;
bmpfile.bfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpfile.biInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpfile.biInfo.bmiHeader.biWidth = width;
bmpfile.biInfo.bmiHeader.biHeight = height;
bmpfile.biInfo.bmiHeader.biPlanes = 1;
bmpfile.biInfo.bmiHeader.biBitCount = bitCountPerPix;
bmpfile.biInfo.bmiHeader.biCompression = 0;
bmpfile.biInfo.bmiHeader.biSizeImage = 0;
bmpfile.biInfo.bmiHeader.biXPelsPerMeter = 0;
bmpfile.biInfo.bmiHeader.biYPelsPerMeter = 0;
bmpfile.biInfo.bmiHeader.biClrUsed = 0;
bmpfile.biInfo.bmiHeader.biClrImportant = 0;
fwrite(&(bmpfile.bfHeader), sizeof(BITMAPFILEHEADER), 1, fp);
fwrite(&(bmpfile.biInfo.bmiHeader), sizeof(BITMAPINFOHEADER), 1, fp);
char *pEachLinBuf = (char*)malloc(bmppitch);
memset(pEachLinBuf, 0, bmppitch);
char BytePerPix = bitCountPerPix >> 3;
int pitch = width * BytePerPix;
if(pEachLinBuf)
{
int h,w;
for(h=height-1; h>=0; h--)
{
for(w=0; w<width; w++)
{
//copy by a pixel
pEachLinBuf[w*BytePerPix+0] = pData[h*pitch + w*BytePerPix + 0];
pEachLinBuf[w*BytePerPix+1] = pData[h*pitch + w*BytePerPix + 1];
pEachLinBuf[w*BytePerPix+2] = pData[h*pitch + w*BytePerPix + 2];
}
fwrite(pEachLinBuf, bmppitch, 1, fp);
}
free(pEachLinBuf);
}
fclose(fp);
return 1;
}
typedef struct _LI_RGB
{
char b;
char g;
char r;
}LI_RGB;
int PutBMP(FILE *fp16,char *str)
{
const unsigned char bit[8]={128,64,32,16,8,4,2,1};
int x,y,wid;
int WIDTH=strlen(str)*8,HEIGHT=16;
long len;
char buf[32];
LI_RGB pRGB[HEIGHT][WIDTH]; // 定義位圖數據
memset(pRGB, 0XFF, sizeof(pRGB)); // 設置背景爲白色
for(wid=0;wid<strlen(str);wid++)
{
len=str[wid]*16;
fseek(fp16,len,SEEK_SET);
fread(buf,1,16,fp16);
for (y=0;y<16;y++)
{
for (x=0;x<8;x++)
{
if (buf[y+x/8]&bit[x%8])
{
pRGB[y][wid*8+x].b = 0x00;
pRGB[y][wid*8+x].g = 0x00;
pRGB[y][wid*8+x].r = 0x00;
}
}
}
}
GenBmpFile((char*)pRGB, 24, WIDTH, HEIGHT, "out.bmp");//生成BMP文件
return 1;
}
int main(char argc, char *argv[])
{
char buf[30]={"2014/10/15 17:06"};
FILE *fd = fopen("ASC16", "rb");
if(!fd)
{
printf("fopen failed : %s, %d\n", __FILE__, __LINE__);
return 0;
}
PutBMP(fd,buf);
fclose(fd);
return 1;
}
這是最終程序生成的out.bmp圖片。
——————————海魚