帮忙VC代码转DELPHI
帮忙VC代码转DELPHI
HBITMAP Csample_BioneFPAPIDlg::BMPDataBufferToHBITMAP(char * m_pBMPBuffer)
{
HBITMAP hBmp;
LPSTR hDIB,lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;
bmfHeaderLen = sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
//if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) return NULL;
if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;//我copy《Windows程序设计》上的做法。
hDIB = lpBuffer + bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
/*
int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;
if( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +
((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
*///原来的代码
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;//这行功能和上面被注释掉的代码相同,容易理解。
CClientDC dc(this);
hBmp = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
//dc.DeleteDC();
//dc.DeleteDC();
return hBmp;
}
void Csample_BioneFPAPIDlg::GetBmpFileDataFromPictureData(unsigned char * bmpfiledata, unsigned char * bmpdata, int bmpwidth, int bmpheight)
{
int m_WidthOfModel = bmpwidth;
int m_HeightOfModel = bmpheight;
BITMAPFILEHEADER bmfHdr; //定义文件头
BITMAPINFOHEADER bmiHdr; //定义信息头
RGBQUAD rgbQuad[256]; //定义调色板
//对信息头进行赋值
bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
bmiHdr.biWidth = m_WidthOfModel;
bmiHdr.biHeight = m_HeightOfModel;
bmiHdr.biPlanes = 1;
bmiHdr.biBitCount = 8;
bmiHdr.biCompression = BI_RGB;
bmiHdr.biSizeImage = m_WidthOfModel*m_HeightOfModel;
bmiHdr.biXPelsPerMeter = 0;
bmiHdr.biYPelsPerMeter = 0;
bmiHdr.biClrUsed = 0;
bmiHdr.biClrImportant = 0;
//对调色板进行赋值
for( int i=0; i<256; i++)
{
rgbQuad[i].rgbBlue = (BYTE)i;
rgbQuad[i].rgbGreen = (BYTE)i;
rgbQuad[i].rgbRed = (BYTE)i;
rgbQuad[i].rgbReserved = 0;
}
//对文件头进行赋值
bmfHdr.bfType = (WORD)0x4D42;//;((WORD)('M'<<8) | 'B')
bmfHdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 + m_WidthOfModel*m_HeightOfModel);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
int fileheaderlength = sizeof(BITMAPFILEHEADER);
int infoheaderlength = sizeof(BITMAPINFOHEADER);
int RGBQUADlength = sizeof(RGBQUAD)*256;
int begin = fileheaderlength+infoheaderlength+RGBQUADlength;
int end = m_WidthOfModel*m_HeightOfModel;
int a = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
//CString ss;
//ss.Format(_T("%d"),begin);
//AfxMessageBox(ss);
memcpy(bmpfiledata,&bmfHdr,fileheaderlength);
memcpy(bmpfiledata+fileheaderlength,&bmiHdr,infoheaderlength);
memcpy(bmpfiledata+fileheaderlength+infoheaderlength,rgbQuad,RGBQUADlength);
memcpy(bmpfiledata+begin,bmpdata,end);
}