2016-12-08 10 views
1

私はbiometrics SDKを使用しています。そして、私はdllを消費するためにヘッダをdelphiに変換しました。コールバック関数のパラメータから値を取得

implementation 

{$R *.dfm} 

procedure EventCallback(eventType: Integer; readerName: PAnsiChar; image: PBiometricImage; userData: Pointer); stdcall; 
begin 
    case eventType of 
    VRBIO_CAPTURE_EVENT_UNPLUG:    Form1.Memo1.Lines.Add('Leitor desconectado!'); 
    VRBIO_CAPTURE_EVENT_REMOVED:    Form1.Memo1.Lines.Add('Dedo removido!'); 
    VRBIO_CAPTURE_EVENT_PLACED:    Form1.Memo1.Lines.Add('Dedo detectado!'); 
    VRBIO_CAPTURE_EVENT_IMAGE_FRAME:   Form1.Memo1.Lines.Add('Frame capturado!'); 
    VRBIO_CAPTURE_EVENT_IMAGE_CAPTURED:  Form1.Memo1.Lines.Add('Imagem capturada!'); 
    VRBIO_CAPTURE_EVENT_FAKE_FINGER_DETECTED: Form1.Memo1.Lines.Add('Dedo falso detectado!'); 
    VRBIO_CAPTURE_EVENT_FAKE_FINGER_REMOVED: Form1.Memo1.Lines.Add('Dedo falso removido!'); 

    VRBIO_CAPTURE_EVENT_PLUG: 
    begin 
     VStartReader(readerName); 
     Form1.Memo1.Lines.Add('Leitor conectado!'); 
    end; 

    end; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    VStartSDK(EventCallback); 
end; 

私の質問に:それはこのようになります使用

const 
{VrBio_EventType} 
    VRBIO_CAPTURE_EVENT_UNPLUG    = $001; {Fingerprint scanner unplugged from the computer.} 
    VRBIO_CAPTURE_EVENT_PLUG     = $002; {Fingerprint scanner plugged on the computer.} 
    VRBIO_CAPTURE_EVENT_REMOVED    = $004; {Finger removed from the fingerprint scanner.} 
    VRBIO_CAPTURE_EVENT_PLACED    = $008; {Finger placed on the fingerprint scanner.} 
    VRBIO_CAPTURE_EVENT_IMAGE_FRAME   = $10; {A fingerprint frame was captured on the fingerprint scanner.} 
    VRBIO_CAPTURE_EVENT_IMAGE_CAPTURED  = $020; {A fingerprint image was captured on the fingerprint scanner.} 
    VRBIO_CAPTURE_EVENT_FAKE_FINGER_DETECTED = $400; {A false finger has been detected on the sensor} 
    VRBIO_CAPTURE_EVENT_FAKE_FINGER_REMOVED = $800; {A false finger has been removed from the sensor} 

type 

(* Stores the parameters of the ISO 19794-4 image format. @see VGetReaderProperties @see VrBio_ReaderProperty 
typedef struct 
{ 
    /** @see VrBio_ISO197944CompressionMode*/ 
    int compressionMode; 
    /** @see VrBio_ISO197944ImpressionType*/ 
    int impressionType; 
    /** @see VrBio_ISO197944FingerPosition*/  
    int fingerPosition; 

}VrBio_ISO197944Parameters; 
*) 

    PISO197944Parameters = ^TISO197944Parameters; 
    TISO197944Parameters = record 
     compressionMode: Integer; { @see VrBio_ISO197944CompressionMode} 
     impressionType: Integer; { @see VrBio_ISO197944ImpressionType} 
     fingerPosition: Integer; { @see VrBio_ISO197944FingerPosition} 
    end; 

(* Represents a biometric image. @see VrBio_CaptureEventCallback \ref VSyncCapture 
struct VrBio_BiometricImage 
{ 
    /** Image width.*/ 
    int width; 
    /**Image height*/ 
    int height; 
    /**Image resolution in dpi. For the obsolete functions, use pixels/cm.*/ 
    int resolution; 
    /**Number of channels in the image. Fingerprint images should always be grayscale, so this value is always 1.*/ 
    int channels; 
    /**Biometric modality. 
    * Always use VRBIO_BIOMETRIC_MODALITY_FINGERPRINT. 
    * \ref VrBio_BiometricModality. 
    */ 
    int biometricModality; 
    /**Scanner type. 
    * \ref VrBio_ScannerType. 
    */ 
    int scannerType; 
    /**Formato de imagem: Formato da imagem. 
    *\ ref VrBio_ImageFormat.*/ 
    int imageFormat; 
    /**Size of the buffer*/ 
    int bufferSize; 
    /**Compression rate. Valid for images that allow compression. 
    * \ref VrBio_CompressionRate 
    */ 
    int compressionRate; 
/**Quality of the fingerprint image. 
    * \ref VrBio_FingerQuality 
    */ 
    int fingerQuality; 

    /** Only valid if the image if imageFormat is \ref VrBio_ImageFormat::VRBIO_IMAGEFORMAT_ISO19794_4 
    *\ref VrBio_ISO197944Parameters 
    */ 
    VrBio_ISO197944Parameters* ISO197944_parameters; 

    /** Buffer storing the pixels of the image. 
    The position(x,y,c) of a pixel is y*width*channels+x*channels+c. 
    */ 
    unsigned char* buffer; 

    /**Reserved for future use*/ 
    void* reserved; 
}; 

typedef struct VrBio_BiometricImage VrBio_BiometricImage; 
*) 
    PBiometricImage = ^TBiometricImage; 
    TBiometricImage = record 
    width: Integer;        { Image width. } 
    height: Integer;       { Image height } 
    resolution: Integer;      { Image resolution in dpi. For the obsolete functions, use pixels/cm.} 
    channels: Integer;       { Number of channels in the image. Fingerprint images should always be grayscale, so this value is always 1. } 
    biometricModality: Integer;     { Biometric modality. Always use VRBIO_BIOMETRIC_MODALITY_FINGERPRINT. \ref VrBio_BiometricModality. } 
    scannerType: Integer;      { Scanner type. \ref VrBio_ScannerType. } 
    imageFormat: Integer;      { Formato de imagem: Formato da imagem. \ ref VrBio_ImageFormat. } 
    bufferSize: Integer;      { Size of the buffer } 
    compressionRate: Integer;     { Compression rate. Valid for images that allow compression. \ref VrBio_CompressionRate } 
    fingerQuality: Integer;      { Quality of the fingerprint image. \ref VrBio_FingerQuality } 
    ISO197944_parameters: PISO197944Parameters; { Only valid if the image if imageFormat is \ref VrBio_ImageFormat::VRBIO_IMAGEFORMAT_ISO19794_4 \ref VrBio_ISO197944Parameters } 
    buffer: PByte;        { Buffer storing the pixels of the image. The position(x,y,c) of a pixel is y*width*channels+x*channels+c. } 
    reserved: Pointer;       { Reserved for future use } 
    end; 

(* 
#include "VTypes.h" 

#ifdef WIN32 
#define DLLIMPORT extern "C" __declspec(dllimport) int __stdcall 
#else 
#define DLLIMPORT extern "C" 
#endif 
*) 

{ Callback function that receives events.. 
typedef void (*VrBio_CaptureEventCallback) (
        int eventType, 
      const char* readerName, 
    VrBio_BiometricImage* image, 
      const void* userData) 
} 
    TCaptureEventCallback = procedure(eventType: Integer; readerName: PAnsiChar; image: PBiometricImage; userData: Pointer); stdcall; 

{ Function responsible for initializing the SDK. This function MUST be called before calling any other method, except \ref VInstallLicense 
    DLLIMPORT VStartSDK(VrBio_CaptureEventCallback eventCallback); 
} 
    function VStartSDK(eventCallback: TCaptureEventCallback): Integer; stdcall; 

{ Function responsible for finalizing the SDK. This function should be called when the SDK is not needed in the application anymore. 
    DLLIMPORT VStopSDK(); 
} 
    function VStopSDK(): Integer; stdcall; 

{ Function responsible for starting the capture on a specific fingerprint reader. 
    After calling this function, the application is able to receive events. 
    DLLIMPORT VStartReader(const char* readerName); 
} 
    function VStartReader(readerName: PAnsiChar): Integer; stdcall; 

は、それは次のようになります

私は、アプリケーションを使用して取得することができますPlugUnplugPlacedイベント、しかし、私はImage Capturedイベントを取得すると、私はアクセスヴィラを持っています。 EventCallbackパラメータイメージの動作中のイベントでは、nilです。 TBiometricImageレコードの変換は正しいですか?

TBiometricImageバッファをTBitmapに変換し、キャプチャしたイメージをTImageに表示するにはどうすればよいですか?

答えて

2

Image Capturedイベントを取得したとき、私はアクセス権を持っています。動作しているイベントでは、EventCallbackパラメータイメージはnilです。 TBiometricImageレコードの変換は正しいですか?

個々のフィールドは細かく宣言されていますが、Delphiレコードの配置とパディングがC/C++の構造体で使用されているものと同じアラインメントとパディングと一致するかどうかを再確認します。それは(コンパイラの設定で構成することができます)通常__cdeclの代わりに、__stdcallで、コンパイラのデフォルトの規則を使用しますので

はまた、より重要なのは、C/C++でのVrBio_CaptureEventCallbackのtypedefは、指定した任意の呼び出し規約ずに宣言されています。 Delphiでは、の代わりにstdcallを使用するとTCaptureEventCallbackと宣言しました。呼び出し規約を正しく一致させる必要があります(エクスポートされたDLL関数はstdcallを使用するため、そこには問題ありません)。

TBiometricImageバッファをTBitmapに変換し、キャプチャしたイメージをTImageに表示するにはどうすればよいですか?

SDKのドキュメントでは、さまざまな画像形式の処理方法について説明していません。しかし、構造体の宣言を見ると、bufferフィールドは実際のイメージデータを指し、imageFormatフィールドはそのデータのフォーマットを示します(まだ変換していないVrBio_ImageFormat列挙体があります)。だから、最初にimageFormatを見て、bufferの解釈方法を知る必要があります。

私はVConvertImage()機能を利用しています。したがって、イメージがBMP形式に変換されていない場合は、イメージをBMP形式に変換できるはずです。 SDKのサンプルに基づいて、bufferデータが標準のBMPファイル形式であるように見えるので、bufferTMemoryStreamにコピーしてからTBitmap.LoadFromStream()メソッドを使用してみてください。

あなたが最初のBMPに変換することなく、スキャンしたGIF/JPG画像を表示したい場合は、それぞれ、TGIFImageTJPEGImageで扱う、あるいはTWICImageすることができ利用できるGIFやJPG画像形式は、もあります。使用可能なRAW画像フォーマットもありますが、画像はRAW画像を処理する標準のVCL TGraphicクラスはありませんが、周りを見回すとサードパーティのクラスが浮かんでいるかもしれません。

そうしないと、あなたが必要な場合は、BMPに画像データを変換してみてください、そして、その後のWin32 API CreateBitmap/Indirect()またはCreateDibSection()関数にbufferを渡し、その後、成功した場合TBitmap.Handleプロパティに結果HBITMAPを割り当てることができます。

+0

答えをありがとう。あなたは呼び出し規約について正しいです、私は今すべてのイベントをキャプチャすることができます! 実際に私が質問に入れなかった他の構造があります。 'VrBio_ImageFormat'は次のようになります。 ' TImageFormat =( VRBIO_IMAGEFORMAT_UNKNOWN、 VRBIO_IMAGEFORMAT_RAW、 VRBIO_IMAGEFORMAT_BMP、 VRBIO_IMAGEFORMAT_WSQ、 VRBIO_IMAGEFORMAT_ISO19794_4、 VRBIO_IMAGEFORMAT_JPEG、 VRBIO_IMAGEFORMAT_TIFF、 VRBIO_IMAGEFORMAT_PNG、 VRBIO_IMAGEFORMAT_GIF); ' 私が手フォーマットは' RAW'です。 –

+1

また、SDKのドキュメントを見ることなく、ここにいる誰もが、特定の画像タイプのピクセルデータの外観を知る方法はありません。おそらく 'RAW'データはRGBカラーであるか、実際のデータは実際の[RAW画像](https://en.wikipedia.org/wiki/Raw_image_format)です。 –

+1

答えを更新しました。 –

関連する問題