该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
终于找到了,前段时间研究jpg的时候,顺便做的一个实验,直接输出bmp文件。参考了微软的一个很老的代码里的字节对齐。。但愿对你有帮助吧。
#include
#include
// showdib.h 157行,字节对齐
#define WIDTHBYTES(i) ((i+31)/32*4)
int main()
{
BITMAPINFOHEADER bi;
memset(&bi, 0, sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = 25;
bi.biHeight = 25;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
bi.biCompression = BI_RGB;
DWORD img_size = (DWORD)WIDTHBYTES(bi.biWidth * bi.biBitCount) * bi.biHeight;
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42;
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + img_size;
bmfh.bfReserved1 = 0; // must be 0
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
unsigned char *img_data = new unsigned char[img_size];
unsigned char *p = img_data;
for(int i = 0; i < bi.biHeight; i++)
{
p += WIDTHBYTES(bi.biWidth*bi.biBitCount);
for(int j = 0; j < bi.biWidth * 3; j+=3)
{
*(p+j) = 0;//B
*(p+j+1) = 0;//G
*(p+j+2) = 255; //R
}
}
/// 神奇,居然写成功了。
FILE *fp = fopen("y.bmp", "wb");
fwrite(&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, fp);
fwrite(img_data, img_size, 1, fp);
fclose(fp);
delete[] img_data;
}
输出一个25*25红色的bmp文件,大至关键点有三个,第一,是以二进制方式写,第二,像素点写入顺序是BGR,也就是绿兰红,第三就是那个字节对齐问题。仅供你参考。