2015-04-14 10 views
7

मैं वास्तव में फिंगरप्रिंट सेंसर से छवि को सहेजने के लिए कोड एकत्र करने का प्रयास कर रहा हूं। मैंने पहले ही फ़ोरम की कोशिश की है और यह मेरा वर्तमान कोड है जो फ़ाइल को सही फ़ाइल आकार के साथ सहेजता है लेकिन जब मैं छवि खोलता हूं, तो यह फिंगरप्रिंट की छवि नहीं है बल्कि यह दूषित छवि की तरह दिखता है। यहां है कि यह कैसा लग रहा है।फ़िंगरप्रिंट सेंसर से सहेजी गई छवि दूषित

enter image description here

मेरे कोड नीचे दी गई है। किसी भी तरह की सहायता को आभार समझेंगे। मैं विंडोज़ विकास के लिए नया हूँ।

bool SaveBMP(BYTE* Buffer, int width, int height, long paddedsize, LPCTSTR bmpfile) 
    { 
     BITMAPFILEHEADER bmfh; 
     BITMAPINFOHEADER info; 
     memset(&bmfh, 0, sizeof(BITMAPFILEHEADER)); 
     memset(&info, 0, sizeof(BITMAPINFOHEADER)); 
     //Next we fill the file header with data: 
     bmfh.bfType = 0x4d42;  // 0x4d42 = 'BM' 
     bmfh.bfReserved1 = 0; 
     bmfh.bfReserved2 = 0; 
     bmfh.bfSize = sizeof(BITMAPFILEHEADER) + 
      sizeof(BITMAPINFOHEADER) + paddedsize; 
     bmfh.bfOffBits = 0x36; 
     //and the info header: 
     info.biSize = sizeof(BITMAPINFOHEADER); 
     info.biWidth = width; 
     info.biHeight = height; 
     info.biPlanes = 1; 

     info.biBitCount = 8; 
     info.biCompression = BI_RGB; 

     info.biSizeImage = 0; 
     info.biXPelsPerMeter = 0x0ec4; 
     info.biYPelsPerMeter = 0x0ec4; 
     info.biClrUsed = 0; 

     info.biClrImportant = 0; 

     HANDLE file = CreateFile(bmpfile, GENERIC_WRITE, FILE_SHARE_READ, 
      NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

     //Now we write the file header and info header: 
     unsigned long bwritten; 
     if (WriteFile(file, &bmfh, sizeof(BITMAPFILEHEADER), 
      &bwritten, NULL) == false) 
     { 
      CloseHandle(file); 
      return false; 
     } 

     if (WriteFile(file, &info, sizeof(BITMAPINFOHEADER), 
      &bwritten, NULL) == false) 
     { 
      CloseHandle(file); 
      return false; 
     } 
     //and finally the image data: 
     if (WriteFile(file, Buffer, paddedsize, &bwritten, NULL) == false) 
     { 
      CloseHandle(file); 
      return false; 
     } 
     //Now we can close our function with 
     CloseHandle(file); 
     return true; 
    } 

    HRESULT CaptureSample() 
    { 
     HRESULT hr = S_OK; 
     WINBIO_SESSION_HANDLE sessionHandle = NULL; 
     WINBIO_UNIT_ID unitId = 0; 
     WINBIO_REJECT_DETAIL rejectDetail = 0; 
     PWINBIO_BIR sample = NULL; 
     SIZE_T sampleSize = 0; 

     // Connect to the system pool. 
     hr = WinBioOpenSession(
      WINBIO_TYPE_FINGERPRINT, // Service provider 
      WINBIO_POOL_SYSTEM,   // Pool type 
      WINBIO_FLAG_RAW,   // Access: Capture raw data 
      NULL,      // Array of biometric unit IDs 
      0,       // Count of biometric unit IDs 
      WINBIO_DB_DEFAULT,   // Default database 
      &sessionHandle    // [out] Session handle 
      ); 


     // Capture a biometric sample. 
     wprintf_s(L"\n Calling WinBioCaptureSample - Swipe sensor...\n"); 
     hr = WinBioCaptureSample(
      sessionHandle, 
      WINBIO_NO_PURPOSE_AVAILABLE, 
      WINBIO_DATA_FLAG_RAW, 
      &unitId, 
      &sample, 
      &sampleSize, 
      &rejectDetail 
      ); 

     wprintf_s(L"\n Swipe processed - Unit ID: %d\n", unitId); 
     wprintf_s(L"\n Captured %d bytes.\n", sampleSize); 

     PWINBIO_BIR_HEADER BirHeader = (PWINBIO_BIR_HEADER)(((PBYTE)sample) + sample->HeaderBlock.Offset); 
     PWINBIO_BDB_ANSI_381_HEADER AnsiBdbHeader = (PWINBIO_BDB_ANSI_381_HEADER)(((PBYTE)sample) + sample->StandardDataBlock.Offset); 
     PWINBIO_BDB_ANSI_381_RECORD AnsiBdbRecord = (PWINBIO_BDB_ANSI_381_RECORD)(((PBYTE)AnsiBdbHeader) + sizeof(WINBIO_BDB_ANSI_381_HEADER)); 
     PBYTE firstPixel = (PBYTE)((PBYTE)AnsiBdbRecord) + sizeof(WINBIO_BDB_ANSI_381_RECORD); 
     SaveBMP(firstPixel, AnsiBdbRecord->HorizontalLineLength, AnsiBdbRecord->VerticalLineLength, AnsiBdbRecord->BlockLength, "D://test.bmp"); 

     wprintf_s(L"\n Press any key to exit."); 
     _getch(); 
    } 
+1

[BITMAPINFOHEADER] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd318229.aspx): * "अगर ** biCompression ** के बराबर होती है ** BI_RGB ** और बिटमैप 8 बीपीपी या उससे कम का उपयोग करता है, बिटमैप में ** बिटमैपिनफोइडर ** संरचना के बाद तत्काल रंगीन रंग होता है। रंग तालिका में ** RGBQUAD ** मानों की एक सरणी होती है। सरणी का आकार ** द्वारा दिया जाता है biClrUsed ** सदस्य। यदि ** biClrUsed ** शून्य है, तो सरणी में दिए गए बिटडेपथ के लिए रंगों की अधिकतम संख्या होती है; यानी, 2^** biBitCount ** रंग। "* – IInspectable

+0

फ़िंगरप्रिंट सीधे किसी कंप्यूटर से कनेक्ट होता है या माइक्रो नियंत्रक? आप अपने सिस्टम पर उंगली प्रिंट कैसे कनेक्ट करते हैं? –

+0

नहीं, यह सीधे यूएसबी का उपयोग कर पीसी से जुड़ा हुआ है। –

उत्तर

2

IInspectable सही है, तो भ्रष्टाचार ऐसा रंग तालिकाओं के अपने निहित उपयोग से आ रहा है दिखता है: अपने डेटा है

info.biBitCount = 8; 
info.biCompression = BI_RGB; 

तो वास्तव में सिर्फ 24 बिट आरजीबी, आप info.biBitCount = 24; कर सकते हैं एक प्रस्तुत करना वैध बिटमैप। यदि यह उससे कम (या उच्च) है, तो आपको कुछ रूपांतरण कार्य करने की आवश्यकता होगी। आप यह पुष्टि करने के लिए AnsiBdbHeader->PixelDepth देख सकते हैं कि यह प्रति बिट 8 बिट्स है जो आप उम्मीद करते हैं।

यह भी लगता है कि SaveBMP में आपके पास AnsiBdbRecord->BlockLength को सही नहीं है। इस क्षेत्र के लिये दस्तावेज कहते हैं:

WINBIO_BDB_ANSI_381_RECORD structure
BlockLength
इस संरचना में बाइट की संख्या के साथ साथ नमूना छवि डेटा की बाइट की संख्या शामिल हैं।

तो आप अपने बिटमैप बफर आकार के रूप में इसे पास करने से पहले sizeof(WINBIO_BDB_ANSI_381_RECORD) घटाकर सुनिश्चित करना चाहते हैं।

साइड नोट, सुनिश्चित करें कि आप कैप्चर करने के बाद शामिल स्मृति को मुक्त करते हैं।

WinBioFree(sample); 
WinBioCloseSession(sessionHandle); 
+0

डेटा आरजीबी नहीं है, फिंगरप्रिंट स्कैनर एक मोनोक्रोम छवि उत्पन्न करते हैं। WINBIO_BDB_ANSI_381_HEADER.PixelDepth प्रति पिक्सेल बिट्स की संख्या इंगित करता है। ImageCompressionAlg सदस्य भी प्रासंगिक है। –

संबंधित मुद्दे