2010-05-22 15 views
5

से Win32 सी/सी ++ लोड छवि मैं Win32 एप्लिकेशन पर एक छवि (.bmp) फ़ाइल लोड करना चाहता हूं, लेकिन मैं विंडोज एपीआई से मानक लोडबिटमैप/लोड इमेज का उपयोग नहीं करना चाहता: मैं इसे लोड करना चाहता हूं एक बफर जो पहले से ही स्मृति में है। मैं आसानी से एक फ़ाइल से बिटमैप लोड कर सकता हूं और इसे स्क्रीन पर प्रिंट कर सकता हूं, लेकिन यह मुद्दा मुझे अटक गया है।मेमोरी बफर

क्या मैं के लिए देख रहा हूँ एक समारोह है कि इस तरह काम करता है:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height); 

उत्तर

5

कभी नहीं, मुझे मेरा समाधान मिला! प्रारंभिक कोड यहां दिया गया है:

std::ifstream is; 
is.open("Image.bmp", std::ios::binary); 
is.seekg (0, std::ios::end); 
length = is.tellg(); 
is.seekg (0, std::ios::beg); 
pBuffer = new char [length]; 
is.read (pBuffer,length); 
is.close(); 

tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer; 
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER)); 
RGBQUAD    rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER)); 

BITMAPINFO bi; 
bi.bmiColors[0] = rgb; 
bi.bmiHeader = bih; 

char* pPixels = (pBuffer+bfh.bfOffBits); 

char* ppvBits; 

hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0); 
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS); 

GetObject(hBitmap, sizeof(BITMAP), &cBitmap); 
+0

हैलो मैं जावा डेवलपर हूं लेकिन मेरे आवेदन में मुझे सी ++ से छवि लोड करने की भी आवश्यकता है और मुझे नहीं पता कि यह कैसे करना है। मैं इंटरनेट पर इतनी देर तक शोध कर रहा हूं लेकिन अभी भी इसे प्राप्त नहीं कर सकता। तो क्या आप अपना पूरा कोड प्रदान करेंगे, मुझे इसे बुरी तरह से जरूरी है। कृप्या – Jony

0

नहीं, लेकिन आप एक नया बिटमैप स्मृति में वर्तमान एक के आकार बना सकते हैं और पर अपनी स्मृति संरचना बारे में यह।

आप CreateBitmap फ़ंक्शन की तलाश में हैं। अपने डेटा में lpv बिट्स सेट करें।

3

CreateBitmap() का प्रयास करें:

HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height) 
{ 
    return CreateBitmap(width, height, 1, 24, buffer); 
} 
3

CreateDIBSection एक छोटे से उपयोग करने के लिए जटिल हो सकता है, लेकिन चीजों को यह कर सकते हैं में से एक एक स्वतंत्र यंत्र बिटमैप बना सकते हैं और आप बिटमैप बिट्स के लिए बफर करने के लिए एक सूचक देना है । अनुमोदित, आपके पास पहले से ही बिटमैप बिट्स से भरा बफर है, लेकिन कम से कम आप डेटा कॉपी कर सकते हैं।

थोड़ा अटकलें: CreateDIBSection भी फ़ाइल वस्तुओं से बिटमैप्स बना सकते हैं, और वहाँ शायद एक तरह से विंडोज आप एक फ़ाइल वस्तु स्मृति का एक हिस्सा प्रतिनिधित्व करने देने के लिए प्राप्त करने के लिए है, जो आप एक बिटमैप से सीधे बनाया देने में CreateDIBSection चाल हो सकता है आपके बफर।

+0

CreateDIBSection उपयोग करने के लिए सही API है। इसका उपयोग करने वाली स्मृति को एक विशेष प्रकार की कर्नेल मेमोरी होना चाहिए (क्योंकि ग्राफिक्स डिवाइस ड्राइवर को इसे एक्सेस करने की आवश्यकता है) - जो फ़ाइल अनुभाग (एक कर्नेल संरचना स्वयं होने) से संतुष्ट हो सकता है या CreateDIBSection स्मृति को आवंटित करके। –