Q&A

  • C++을 델파이로 포팅하는데 잘 안되네요..도움좀 부탁드리겠습니다.
한 지문인식업체로부터 sdk를 제공받아서 분석중에 있습니다.
메모리에 포인터..ㅠㅠ 힘드네요..
메모리에 올려진 자료를 파라독스 DB에 저장하고 다시 불러내어 비교해야 하는데
당최 방법을 모르겠습니다..
억세스 에러까지..ㅠㅠ
제가 생각한것은 일단 인식받은 자료를 BMP형태로 DB에 넣고 차후에 다시 Byte형태로 만들어서 비교할까 하고 작성해보았습니다.
아래 방법이 아니더라도 다른 방법이 있으면 알려주셔도 됩니다.

C++ 원본
int SaveBMP( const char* FileName, BYTE* pData, int Width, int Height ) {
    HANDLE hImage;
    int NewWidth = ( Width + 3 ) / 4 * 4;
    int DIBSize = sizeof( BITMAPINFOHEADER ) + sizeof( RGBQUAD ) * 256 + NewWidth * Height;

    BITMAPFILEHEADER bmfHdr;
    bmfHdr.bfType = ( ( WORD ) ( 'M' << 8 ) | 'B' );  // "BM"
    bmfHdr.bfSize = sizeof( BITMAPFILEHEADER ) + DIBSize;
    bmfHdr.bfReserved1 = 0;
    bmfHdr.bfReserved2 = 0;
    bmfHdr.bfOffBits = ( DWORD ) ( sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + sizeof( RGBQUAD ) * 256 );

    if ( ( hImage = ( HGLOBAL ) GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, DIBSize ) ) == NULL ) {
        return FALSE;
    }

    LPSTR pDib = ( LPSTR ) GlobalLock( hImage );
    LPBITMAPINFO pbmi = ( LPBITMAPINFO ) pDib;

    pbmi->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
    pbmi->bmiHeader.biWidth = NewWidth;
    pbmi->bmiHeader.biHeight = Height;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 8;
    pbmi->bmiHeader.biCompression = BI_RGB;
    pbmi->bmiHeader.biSizeImage = Width * Height;
    pbmi->bmiHeader.biXPelsPerMeter = 0;
    pbmi->bmiHeader.biYPelsPerMeter = 0;
    pbmi->bmiHeader.biClrUsed = 0;
    pbmi->bmiHeader.biClrImportant = 0;
    for ( int k = 0 ; k < 256 ; k++ ) {
        pbmi->bmiColors[ k ].rgbRed = pbmi->bmiColors[ k ].rgbGreen = pbmi->bmiColors[ k ].rgbBlue = BYTE( k );
    }

    BYTE* Buffer = ( BYTE* ) ( pDib + sizeof( BITMAPINFOHEADER ) + sizeof( RGBQUAD ) * 256 );
    BYTE* Data = pData + ( Height - 1 ) * Width;
    for ( int i = Height - 1 ; i >= 0 ; i-- ) {
        memcpy( Buffer, Data, Width );
        Buffer += NewWidth;
        Data -= Width;
    }

    ofstream BmpFile( FileName, ios::binary | ios::out );
    BmpFile.write( ( BYTE* ) &bmfHdr, sizeof( BITMAPFILEHEADER ) );
    BmpFile.write( pDib, DIBSize );

    GlobalUnlock( hImage );
    GlobalFree( hImage );

    return TRUE;
}

void CSFR300TestDlg::OnSave()
{
        // TODO: Add your control notification handler code here
        
    if ( SF_GetImageBuffer() ) {
        CFileDialog dlg( TRUE, "bmp", "*.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Fingerprint Image(*.bmp)" );
        if ( dlg.DoModal() == IDOK ) {
            SaveBMP( dlg.GetPathName(), SF_GetImageBuffer(), SF_GetImageWidth(), SF_GetImageHeight() );
        }
    }
}


제가 작성한 델파이 포팅문
var
  Bitmap: THandle;
  orgWidth, orgHeight: Integer;
  iWidth, DIBSize: Integer;
  bmfHdr: BITMAPFILEHEADER;
  pDib: PChar;
  pbmi: PBITMAPINFO;
  i: Integer;
  buffer: pByte;
  pData, Data: pByte;
  fStream: TFileStream;
begin
  orgWidth:= SF_GetImageWidth;
  orgHeight:= SF_GetImageHeight;
  iWidth:= (orgWidth + 3) div 4 * 4;
  DIBSize:= SizeOf(BITMAPINFOHEADER) + SizeOf(RGBQUAD) *256 + iWidth * orgHeight;

  bmfHdr.bfType:= Word((Ord('M') shl 8) or Ord('B'));
  bmfHdr.bfSize:= SizeOf(BITMAPFILEHEADER) + DIBSize;
  bmfHdr.bfReserved1:= 0;
  bmfHdr.bfReserved1:= 0;
  bmfHdr.bfOffBits:= DWord(SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) + SizeOf(RGBQUAD) *256);

  Bitmap:= GlobalAlloc( GMEM_MOVEABLE or GMEM_ZEROINIT, DIBSize );
  pDib:= PChar(GlobalLock(Bitmap));
  pbmi:= PBITMAPINFO(pDib);

  pbmi^.bmiHeader.biSize:= SizeOf(BITMAPINFOHEADER);
  pbmi^.bmiHeader.biWidth:= iWidth;
  pbmi^.bmiHeader.biHeight:= orgHeight;
  pbmi^.bmiHeader.biPlanes:= 1;
  pbmi^.bmiHeader.biBitCount:= 8;
  pbmi^.bmiHeader.biCompression:= BI_RGB;
  pbmi^.bmiHeader.biSizeImage:= orgWidth * orgHeight;
  pbmi^.bmiHeader.biXPelsPerMeter:= 0;
  pbmi^.bmiHeader.biYPelsPerMeter:= 0;
  pbmi^.bmiHeader.biClrUsed:= 0;
  pbmi^.bmiHeader.biClrImportant:= 0;

  for i:= 0 to 255 do begin
    pbmi^.bmiColors[i].rgbRed:= Byte(i);
    pbmi^.bmiColors[i].rgbGreen:= Byte(i);
    pbmi^.bmiColors[i].rgbBlue:= Byte(i);
  end;

  buffer:= pByte(pDib + SizeOf(BITMAPINFOHEADER) + SizeOf(RGBQUAD) * 256);
  pData:= SF_GetImageBuffer;
  Data:= pByte(Integer(pData) + (orgHeight -1) * orgWidth);

  for i:= (orgWidth -1) downto 0 do begin
    Move(Data, buffer, orgHeight);
    buffer:= pByte(Integer(buffer) + iWidth);
    Data:= pByte(Integer(Data) - orgWidth);
  end;

  fStream:= TFileStream.Create('c:\tmp.bmp',fmCreate or fmOpenWrite);
  fStream.Write(bmfHdr, sizeof( BITMAPFILEHEADER ));
  fStream.Write(pDib, DIBSize);

    GlobalUnlock( Bitmap );
    GlobalFree( Bitmap );
end;

0  COMMENTS