已有位图数据,8位灰度,将数据加上BMP文件头保存到文件中。问用DELPHI如何实现?
void CComCtrl::GetPicture(LPWSTR lpwEncapsulateData, DWORD dwEncapsulateDataLen)
{
lpwEncapsulateData += 2;
dwEncapsulateDataLen -= 6; std::auto_ptr<BITMAPINFO> pBitmapInfo (new BITMAPINFO);
BITMAPFILEHEADER BFH;
::FillMemory((PVOID)&BFH, (DWORD)sizeof(BITMAPFILEHEADER) ,0); CFileDialog FileDialog( FALSE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"摄像机图像文件(*.bmp)|*.bmp||",NULL);
if(FileDialog.DoModal()==IDOK)
{
CFile ToFile;
BeginWaitCursor();
BFH.bfType = 0x4d42;//文件头内容
BFH.bfSize = 0x051036;
BFH.bfOffBits = 0X036;
pBitmapInfo->bmiHeader.biSize = 0x028;
pBitmapInfo->bmiHeader.biWidth = 0x0180;
pBitmapInfo->bmiHeader.biHeight = 0x0120;
pBitmapInfo->bmiHeader.biPlanes = 0x01;
pBitmapInfo->bmiHeader.biBitCount = 0x018;
pBitmapInfo->bmiHeader.biCompression = 0;
pBitmapInfo->bmiHeader.biSizeImage = 0x051000;
pBitmapInfo->bmiHeader.biXPelsPerMeter = 0x0ec4;
pBitmapInfo->bmiHeader.biYPelsPerMeter = 0x0ec4;//文件头内容结束 if( ToFile.Open( FileDialog.GetPathName(),CFile::modeCreate|CFile::modeReadWrite ) )
{
ToFile.Write(&BFH, sizeof( BITMAPFILEHEADER ));
if(pBitmapInfo->bmiHeader.biHeight>0)
pBitmapInfo->bmiHeader.biHeight=0-pBitmapInfo->bmiHeader.biHeight;
//使图像倒过来 ToFile.Write(&pBitmapInfo->bmiHeader, sizeof (BITMAPINFOHEADER)); for(int i = 0; i < (int)(dwEncapsulateDataLen/2); i++ )
{//对返回的384*288个图像数据灰度进行存储。
BYTE ucGrey = ((*(lpwEncapsulateData+i))>>8);
for(int j=0;j<3;j++)
ToFile.Write(&ucGrey, sizeof(BYTE));
ucGrey = LOBYTE(*(lpwEncapsulateData+i));
for(j=0;j<3;j++)
ToFile.Write(&ucGrey, sizeof(BYTE));
}
ToFile.Close();
}
EndWaitCursor();
}
void CComCtrl::GetPicture(LPWSTR lpwEncapsulateData, DWORD dwEncapsulateDataLen)
{
lpwEncapsulateData += 2;
dwEncapsulateDataLen -= 6; std::auto_ptr<BITMAPINFO> pBitmapInfo (new BITMAPINFO);
BITMAPFILEHEADER BFH;
::FillMemory((PVOID)&BFH, (DWORD)sizeof(BITMAPFILEHEADER) ,0); CFileDialog FileDialog( FALSE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"摄像机图像文件(*.bmp)|*.bmp||",NULL);
if(FileDialog.DoModal()==IDOK)
{
CFile ToFile;
BeginWaitCursor();
BFH.bfType = 0x4d42;//文件头内容
BFH.bfSize = 0x051036;
BFH.bfOffBits = 0X036;
pBitmapInfo->bmiHeader.biSize = 0x028;
pBitmapInfo->bmiHeader.biWidth = 0x0180;
pBitmapInfo->bmiHeader.biHeight = 0x0120;
pBitmapInfo->bmiHeader.biPlanes = 0x01;
pBitmapInfo->bmiHeader.biBitCount = 0x018;
pBitmapInfo->bmiHeader.biCompression = 0;
pBitmapInfo->bmiHeader.biSizeImage = 0x051000;
pBitmapInfo->bmiHeader.biXPelsPerMeter = 0x0ec4;
pBitmapInfo->bmiHeader.biYPelsPerMeter = 0x0ec4;//文件头内容结束 if( ToFile.Open( FileDialog.GetPathName(),CFile::modeCreate|CFile::modeReadWrite ) )
{
ToFile.Write(&BFH, sizeof( BITMAPFILEHEADER ));
if(pBitmapInfo->bmiHeader.biHeight>0)
pBitmapInfo->bmiHeader.biHeight=0-pBitmapInfo->bmiHeader.biHeight;
//使图像倒过来 ToFile.Write(&pBitmapInfo->bmiHeader, sizeof (BITMAPINFOHEADER)); for(int i = 0; i < (int)(dwEncapsulateDataLen/2); i++ )
{//对返回的384*288个图像数据灰度进行存储。
BYTE ucGrey = ((*(lpwEncapsulateData+i))>>8);
for(int j=0;j<3;j++)
ToFile.Write(&ucGrey, sizeof(BYTE));
ucGrey = LOBYTE(*(lpwEncapsulateData+i));
for(j=0;j<3;j++)
ToFile.Write(&ucGrey, sizeof(BYTE));
}
ToFile.Close();
}
EndWaitCursor();
}
DWORD dwEncapsulateDataLen//数据长度
不过建议你把这个函数作成dll给delphi调用
var
BFH: BITMAPFILEHEADER;
pBitmapInfo: BITMAPINFO;
ToFile: TFileStream;
ucGrey: BYTE;
i, J: Integer;
begin
lpwEncapsulateData := lpwEncapsulateData + 2;
dwEncapsulateDataLen := dwEncapsulateDataLen - 6; FillMemory(@BFH, sizeof(BITMAPFILEHEADER), 0); if SaveDialog1.Execute then
begin
Cursor := crAppStart;
BFH.bfType := $4D42; //文件头内容
BFH.bfSize := $051036;
BFH.bfOffBits := $036; pBitmapInfo.bmiHeader.biSize := $028;
pBitmapInfo.bmiHeader.biWidth := $0180;
pBitmapInfo.bmiHeader.biHeight := $0120;
pBitmapInfo.bmiHeader.biPlanes := $01;
pBitmapInfo.bmiHeader.biBitCount := $018;
pBitmapInfo.bmiHeader.biCompression := 0;
pBitmapInfo.bmiHeader.biSizeImage := $051000;
pBitmapInfo.bmiHeader.biXPelsPerMeter := $0EC4;
pBitmapInfo.bmiHeader.biYPelsPerMeter := $0EC4; //文件头内容结束 ToFile.Create(SaveDialog1.FileName, fmCreate);
ToFile.Write(BFH, sizeof(BFH));
if (pBitmapInfo.bmiHeader.biHeight > 0) then
pBitmapInfo.bmiHeader.biHeight := 0 - pBitmapInfo.bmiHeader.biHeight;
//使图像倒过来
ToFile.Write(pBitmapInfo.bmiHeader, sizeof(pBitmapInfo.bmiHeader));
for i := 0 to floor(dwEncapsulateDataLen / 2 - 1) do
//对返回的384*288个图像数据灰度进行存储。
begin
ucGrey := (@(lpwEncapsulateData + i) shr 8);
for j := 0 to 2 do
ToFile.Write(ucGrey, 1);
ucGrey := LOBYTE((lpwEncapsulateData + i));
for j := 0 to 2 do
ToFile.Write(ucGrey, 1);
end;
ToFile.Destroy;
end;
Cursor := crDefault;
end;