已有位图数据,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();
}

解决方案 »

  1.   

    不是必须用这个转吧,有DELPHI自己的
      

  2.   

    delphi如何转,望告知LPWSTR lpwEncapsulateData,//打包的数据
    DWORD dwEncapsulateDataLen//数据长度
      

  3.   

    我不知道delphi中如何已枝地址,获取变量,其他我搞定了
    不过建议你把这个函数作成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;