郑重提示:本代码是一个DLL供C#调用,使用CLI编写,但是原理是一样的。
首先获取到图片数据Buffer(不包含文件头和图片头),然后将之写入图片文件。
// 这是主 DLL 文件。
#include "stdafx.h"
using namespace System;
using namespace System::Runtime::InteropServices;
namespace testSave
{
public ref class Save
{
public:
bool SaveBitmapToFile(array<byte>^ BmpData,int bmpWidth,int bmpHeight,int biBitCount)
{
//
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
FILE *fp1=fopen("Save.bmp","wb+");
if (fp1==0) {return false;};
BITMAPFILEHEADER file;
//
// 位图大小
DWORD dwBmSize = 0;
RGBQUAD *pColorTable;
file.bfType/*[0] */= 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
int colorTablesize=0;
file.bfReserved1 = 0;
file.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
file.bfOffBits=/*54+sizeof(RGBQUAD)*256*/sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 0;
//file.bfOffBits=54+colorTablesize;
//file.bfSize=bmpHeight*bmpWidth*24+file.bfOffBits;
// 计算位图图素数据区大小
dwBmSize = 4 * ((bmpWidth * biBitCount + 31) / 32) * bmpHeight;
// 计算调色板大小
colorTablesize = 0 * sizeof(RGBQUAD);
int m=sizeof(BITMAPINFOHEADER);
file.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+dwBmSize/*+lineByte*bmpHeight*/;
//写文件头进文件
fwrite(&file, sizeof(BITMAPFILEHEADER),1, fp1);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head1;
head1.biBitCount=biBitCount;
head1.biClrImportant=0;
head1.biClrUsed=0;
head1.biCompression=0;
head1.biHeight=bmpHeight;
head1.biPlanes=1;
head1.biSize=40;
head1.biSizeImage=lineByte*bmpHeight;
head1.biWidth=bmpWidth;
head1.biXPelsPerMeter=0;
head1.biYPelsPerMeter=0;
//写位图信息头进内存
fwrite(&head1, sizeof(BITMAPINFOHEADER),1, fp1);
//写位图数据进文件
Byte *p=(Byte*)malloc(bmpHeight*lineByte);
Marshal::Copy(BmpData,0,(IntPtr)p,bmpHeight*lineByte);
fwrite(p, bmpHeight*lineByte, 1, fp1);
//关闭文件
fclose(fp1);
}
};
}