/paste/2011-07-26-16-01-08/fs50/blib/lib/fs/libScanAPI_Linux_15072010/linux_x86_64bit/ftrScanAPI_Ex.c

https://github.com/metaperl/vcpaste · C · 178 lines · 151 code · 13 blank · 14 comment · 14 complexity · 9c23415f9bdeef88a4adf55a9eb934f3 MD5 · raw file

  1. // ftrScanPPCExampleDoc.cpp : implementation of the CFtrScanPPCExampleDoc class
  2. //
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ftrScanAPI.h>
  7. typedef struct tagBITMAPINFOHEADER{
  8. unsigned int biSize;
  9. int biWidth;
  10. int biHeight;
  11. unsigned short int biPlanes;
  12. unsigned short int biBitCount;
  13. unsigned int biCompression;
  14. unsigned int biSizeImage;
  15. int biXPelsPerMeter;
  16. int biYPelsPerMeter;
  17. unsigned int biClrUsed;
  18. unsigned int biClrImportant;
  19. } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
  20. typedef struct tagRGBQUAD {
  21. unsigned char rgbBlue;
  22. unsigned char rgbGreen;
  23. unsigned char rgbRed;
  24. unsigned char rgbReserved;
  25. } RGBQUAD;
  26. typedef struct tagBITMAPINFO {
  27. BITMAPINFOHEADER bmiHeader;
  28. RGBQUAD bmiColors[1];
  29. } BITMAPINFO, *PBITMAPINFO;
  30. typedef struct tagBITMAPFILEHEADER {
  31. unsigned short int bfType;
  32. unsigned int bfSize;
  33. unsigned short int bfReserved1;
  34. unsigned short int bfReserved2;
  35. unsigned int bfOffBits;
  36. } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
  37. int write_bmp_file(unsigned char *pImage, int width, int height)
  38. {
  39. BITMAPINFO *pDIBHeader;
  40. BITMAPFILEHEADER bmfHeader;
  41. int iCyc;
  42. // allocate memory for a DIB header
  43. if( (pDIBHeader = (BITMAPINFO *)malloc( sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 )) == NULL )
  44. {
  45. printf("Alloc memory failed! - Unable to write to file!!\n");
  46. return -1;
  47. }
  48. memset( (void *)pDIBHeader, 0, sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 );
  49. // fill the DIB header
  50. pDIBHeader->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
  51. pDIBHeader->bmiHeader.biWidth = width;
  52. pDIBHeader->bmiHeader.biHeight = height;
  53. pDIBHeader->bmiHeader.biPlanes = 1;
  54. pDIBHeader->bmiHeader.biBitCount = 8; // 8bits gray scale bmp
  55. pDIBHeader->bmiHeader.biCompression = 0; // BI_RGB = 0;
  56. // initialize logical and DIB grayscale
  57. for( iCyc = 0; iCyc < 256; iCyc++ )
  58. {
  59. pDIBHeader->bmiColors[iCyc].rgbBlue = pDIBHeader->bmiColors[iCyc].rgbGreen = pDIBHeader->bmiColors[iCyc].rgbRed = (unsigned char)iCyc;
  60. }
  61. // set BITMAPFILEHEADER structure
  62. //((char *)(&bmfHeader.bfType))[0] = 'B';
  63. //((char *)(&bmfHeader.bfType))[1] = 'M';
  64. bmfHeader.bfType = 0x42 + 0x4D * 0x100;
  65. bmfHeader.bfSize = 14 + sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255 + width * height; //sizeof( BITMAPFILEHEADER ) = 14
  66. bmfHeader.bfOffBits = 14 + pDIBHeader->bmiHeader.biSize + sizeof( RGBQUAD ) * 256;
  67. //write to file
  68. FILE *fp;
  69. fp = fopen("frame_Ex.bmp", "wb");
  70. if( fp == NULL )
  71. {
  72. printf("Failed to write to file\n");
  73. free( pDIBHeader );
  74. return -1;
  75. }
  76. //fwrite( (void *)&bmfHeader, 1, sizeof(BITMAPFILEHEADER), fp );
  77. fwrite( (void *)&bmfHeader.bfType, sizeof(unsigned short int), 1, fp );
  78. fwrite( (void *)&bmfHeader.bfSize, sizeof(unsigned int), 1, fp );
  79. fwrite( (void *)&bmfHeader.bfReserved1, sizeof(unsigned short int), 1, fp );
  80. fwrite( (void *)&bmfHeader.bfReserved2, sizeof(unsigned short int), 1, fp );
  81. fwrite( (void *)&bmfHeader.bfOffBits, sizeof(unsigned int), 1, fp );
  82. //fwrite( (void *)pDIBHeader, 1, sizeof( BITMAPINFO ) + sizeof( RGBQUAD ) * 255, fp );
  83. fwrite( (void *)&pDIBHeader->bmiHeader.biSize, sizeof(unsigned int), 1, fp);
  84. fwrite( (void *)&pDIBHeader->bmiHeader.biWidth, sizeof(int), 1, fp);
  85. fwrite( (void *)&pDIBHeader->bmiHeader.biHeight, sizeof(int), 1, fp);
  86. fwrite( (void *)&pDIBHeader->bmiHeader.biPlanes, sizeof(unsigned short int), 1, fp);
  87. fwrite( (void *)&pDIBHeader->bmiHeader.biBitCount, sizeof(unsigned short int), 1, fp);
  88. fwrite( (void *)&pDIBHeader->bmiHeader.biCompression, sizeof(unsigned int), 1, fp);
  89. fwrite( (void *)&pDIBHeader->bmiHeader.biSizeImage, sizeof(unsigned int), 1, fp);
  90. fwrite( (void *)&pDIBHeader->bmiHeader.biXPelsPerMeter, sizeof(int), 1, fp);
  91. fwrite( (void *)&pDIBHeader->bmiHeader.biYPelsPerMeter, sizeof(int), 1, fp);
  92. fwrite( (void *)&pDIBHeader->bmiHeader.biClrUsed, sizeof(unsigned int), 1, fp);
  93. fwrite( (void *)&pDIBHeader->bmiHeader.biClrImportant, sizeof(unsigned int), 1, fp);
  94. for( iCyc=0; iCyc<256; iCyc++ )
  95. {
  96. fwrite( (void *)&pDIBHeader->bmiColors[iCyc].rgbBlue, sizeof(unsigned char), 1, fp );
  97. fwrite( (void *)&pDIBHeader->bmiColors[iCyc].rgbGreen, sizeof(unsigned char), 1, fp );
  98. fwrite( (void *)&pDIBHeader->bmiColors[iCyc].rgbRed, sizeof(unsigned char), 1, fp );
  99. fwrite( (void *)&pDIBHeader->bmiColors[iCyc].rgbReserved, sizeof(unsigned char), 1, fp );
  100. }
  101. //
  102. // copy fingerprint image
  103. unsigned char *cptrData;
  104. unsigned char *cptrDIBData;
  105. unsigned char *pDIBData;
  106. pDIBData = (unsigned char *)malloc( height * width);
  107. memset( (void *)pDIBData, 0, height * width );
  108. cptrData = pImage + (height - 1) * width;
  109. cptrDIBData = pDIBData;
  110. for( iCyc = 0; iCyc < height; iCyc++ )
  111. {
  112. memcpy( cptrDIBData, cptrData, width );
  113. cptrData = cptrData - width;
  114. cptrDIBData = cptrDIBData + width;
  115. }
  116. fwrite( (void *)pDIBData, 1, width * height, fp );
  117. fclose(fp);
  118. printf("Fingerprint image is written to file: frame_Ex.bmp.\n");
  119. free( pDIBData );
  120. free( pDIBHeader );
  121. return 0;
  122. }
  123. int main(int argc, char *argv[])
  124. {
  125. void *hDevice;
  126. FTRSCAN_IMAGE_SIZE ImageSize;
  127. unsigned char *pBuffer;
  128. int i;
  129. hDevice = ftrScanOpenDevice();
  130. if( hDevice == NULL )
  131. {
  132. printf("Failed to open device!\n");
  133. return -1;
  134. }
  135. if( !ftrScanGetImageSize( hDevice, &ImageSize ) )
  136. {
  137. printf("Failed to get image size\n");
  138. ftrScanCloseDevice( hDevice );
  139. return -1;
  140. }
  141. else
  142. {
  143. printf("Image size is %d\n", ImageSize.nImageSize);
  144. pBuffer = (unsigned char *)malloc( ImageSize.nImageSize );
  145. printf("Please put your finger on the scanner:\n");
  146. while(1)
  147. {
  148. if( ftrScanIsFingerPresent( hDevice, NULL ) )
  149. break;
  150. for(i=0; i<50; i++); //sleep(1)
  151. }
  152. printf("Capturing fingerprint ......");
  153. //nRet = ftrScanGetImage(hDevice, 3, pBuffer);
  154. if( ftrScanGetFrame(hDevice, pBuffer, NULL) )
  155. {
  156. printf("Done!\nWriting to file......\n");
  157. write_bmp_file( pBuffer, ImageSize.nWidth, ImageSize.nHeight );
  158. }
  159. else
  160. printf("Failed to get image?\n");
  161. free( pBuffer );
  162. }
  163. ftrScanCloseDevice( hDevice );
  164. return 0;
  165. }