bmp位图的数据结构如下所示:
unsigned char* pBmpBuf;
int bmpWidth;
int bmpHeight;
RGBQUAD* pColorTable;
int biBitCount;
unsigned char* readBmp(char* bmpName)
{
FILE* fp = fopen(bmpName, "rb"); //以二进制读的方式打开指定的图像文件
if (fp == 0) return 0;
fseek(fp, sizeof(BITMAPFILEHEADER), 0);
BITMAPINFOHEADER infoHead;
fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
bmpWidth = infoHead.biWidth;
bmpHeight = infoHead.biHeight;
biBitCount = infoHead.biBitCount;
//strick
int lineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;
if (biBitCount == 8)
{
pColorTable = new RGBQUAD[256];
fread(pColorTable, sizeof(RGBQUAD), 256, fp);
}
pBmpBuf = new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf, 1, lineByte * bmpHeight, fp);
fclose(fp);
return pBmpBuf;
}
调用的话,输入位图路径,返回位图首地址。
int main()
{
typedef int(__stdcall *Dehaze)(unsigned char *Src, unsigned char *Dest, int Width, int Height, int Stride,
int BlockSize, int GuideRadius, int MaxAtom, float Omega, float T0, float Gamma);
Dehaze pfFuncInDll = NULL;
HINSTANCE hinst = LoadLibraryA("ImageMaster.dll");
unsigned char* C = readBmp("G:\\test.png");
if (hinst != NULL)
{
cout << "ImageMaster.dll load SUCCESS !!!" << endl;
pfFuncInDll = (Dehaze)GetProcAddress(hinst, "IM_HazeRemovalBasedOnDarkChannelPrior");
if (pfFuncInDll != NULL)
{
cout << "IM_HazeRemovalBasedOnDarkChannelPrior function load SUCCESS !!!" << endl;
clock_t start = clock();
int d = pfFuncInDll(C, C, 1023, 763, 4092, 4, 5, 220, 0.9F, 0.01F, 0.9F);
clock_t ends = clock();
cout << "Running Time : " << (double)(ends - start) << "ms" << endl;
cout << d << endl;
}
FreeLibrary(hinst);
}
system("pause");
return 0;
}