2012-10-11 25 views
10

संदर्भ: मैं ओपनसीवी में इसे खिलाने के लिए एक और विंडो का एक स्क्रीनशॉट लेने की कोशिश कर रहा हूं। मुझे वेब पर कुछ कोड मिला जो कि बिटमैप को कुछ ओपनसीवी के साथ काम करने में सक्षम होना चाहिए। दुर्भाग्य से मैं कुछ परेशानी में भाग गया।GetObject शून्य बीएमबीट के साथ एक बिटमैप क्यों देता है?

प्रश्न: बीएमबीट विशेषता/सदस्य हमेशा शून्य क्यों है? (मैं भी BitBlt के बजाय PrintWindow साथ की कोशिश की परिणाम ही था)

#include <iostream> 
#include <string> 
#include <Windows.h> 

int main(int argc, char* argv[]) 
{ 
    std::wstring windowName = L"Calculator"; 

    RECT rect; 
    HWND hwnd = FindWindow(NULL, windowName.c_str()); 
    if (hwnd == NULL) 
    { 
     return 0; 
    } 
    GetClientRect(hwnd, &rect); 

    HDC hdcScreen = GetDC(NULL); 
    HDC hdc = CreateCompatibleDC(hdcScreen); 
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, 
     rect.right - rect.left, rect.bottom - rect.top); 
    SelectObject(hdc, hbmp); 

    PrintWindow(hwnd, hdc, PW_CLIENTONLY); 

    BITMAP bmp; 
    GetObject(hbmp, sizeof(BITMAP), &bmp); 

    return 0; 
} 
+0

क्या आप इस कोड के साथ स्क्रीनशॉट बनाने की कोशिश कर रहे हैं, बस हाथ से? ऐसा दिखता है। प्रिंटविंडो वह नहीं है जो आपको चाहिए यदि वह मामला है। यह सब एक डीसी के साथ लक्ष्य विंडो में WM_PRINT भेजता है जिस पर डंप करना है। इस बात की कोई गारंटी नहीं है कि विंडो उस संदेश को भी संसाधित करेगी, और यदि ऐसा है, तो आप जो चाहते हैं वह करें। आपके पास लगभग हर चीज है जो आपको चाहिए, लेकिन मेरा मानना ​​है कि आपको स्क्रीन डीसी से बिट्स को अपने संगत डीसी में प्राप्त करने के लिए तैयार करने के लिए तैयार होने के लिए बिटबल्ट() का उपयोग करने की आवश्यकता है। – WhozCraig

उत्तर

16

bmBits सदस्य डीआईबी वर्गों के लिए गैर-शून्य है। डिवाइस-निर्भर बिटमैप्स (जैसे कि आप बना रहे हैं) के लिए, bmBits सेट नहीं है क्योंकि पिक्सेल वीडियो कार्ड पर हैं, मुख्य स्मृति में नहीं।

अपने उदाहरण में, आपको CreateCompatibleBitmap से CreateDIBSection को बदलने की आवश्यकता है यदि आप बिट्स तक सीधे पहुंच चाहते हैं।

7

बस जानकारी के लिए। जब फ़ाइल से बिटमैप लोड हो रहा है और बिटमैप .bmBits उपयोग करने के लिए (glTexImage2D, glDrawPixels के लिए) हैं:

LoadImage(NULL, "path_to.bmp", IMAGE_BITMAP, 0, 0, 
             LR_LOADFROMFILE); 

यू झंडा LR_CREATEDIBSECTION

HBITMAP hBmp = NULL; 
BITMAP BMp; 
hBmp = (HBITMAP) LoadImage(NULL, "bitmap.bmp", IMAGE_BITMAP, 0, 0, 
             LR_LOADFROMFILE | LR_CREATEDIBSECTION); 
GetObject(hBmp, sizeof(BMp), &BMp); 
//BMp.bmBits now points to data 
+0

यह एकमात्र उत्तर है जिसे मैंने कभी देखा है जो इसका उल्लेख करता है। आप, महोदय, कमाल हैं! –

-1

एक बात का उल्लेख करना होगा जो आप कर सकते थे GetObject के वापसी मूल्य को देखना है। यदि 0 आपको पता है कि कुछ गलत हो गया है। कॉल के पैरामीटर के साथ कुछ गड़बड़ है।

0

GetObject एमएसडीएन पर दस्तावेज़ीकरण। कृपया दूसरा अनुच्छेद नोट करें।

तो hgdiobjCreateDIBSection बुला द्वारा बनाई गई एक बिटमैप के लिए एक संभाल है, और निर्दिष्ट बफर काफी बड़ा है, GetObject समारोह एक DIBSECTION संरचना देता है। इसके अलावा, बीएमबीटBITMAP संरचना के सदस्य DIBSECTION के भीतर निहित बिटमैप के बिट मानों में एक सूचक शामिल होंगे।

तो hgdiobj किसी अन्य माध्यम, GetObject रिटर्न केवल चौड़ाई, ऊंचाई, और रंग प्रारूप बिटमैप की जानकारी के द्वारा बनाई गई एक बिटमैप के लिए एक संभाल है। आप GetDIBits या GetBitmapBits फ़ंक्शन को कॉल करके बिटमैप के बिट मान प्राप्त कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^