2011-01-03 11 views
5

क्या GetBBitmap का उपयोग किए बिना सीधे एक जीडीआई + बिटमैप से कॉपी करने के लिए बिटबल्ट का उपयोग करना संभव है?क्या जीडीआई + बिटमैप से सीधे बिटबल्ट करना संभव है?

GetHBitmap धीमा है क्योंकि यह बिट छवि की तुलना में धीमी और धीमी गति से पूरी छवि की एक नई प्रति बनाता है, और दिए गए एचबीआईटीएमएपी का निपटान किया जाना चाहिए। छवि बड़ी है।

क्या मूल जीडीआई + छवि के पिक्सेल डेटा का उपयोग करने के लिए बिटबल्ट को इंगित करने का कोई तरीका है?

संपादित करें: मैं एक पॉइंटर प्राप्त कर सकता हूं जहां जीडीआई + बिटमैप पिक्सेल डेटा स्मृति में है। क्या मैं एक एचबीआईटीएमएपी बना सकता हूं जो अतिरिक्त प्रतिलिपि से बचने के लिए जीडीआई + बिटमैप पिक्सेल डेटा को इंगित करता है, और उस से बिटब्लैट?

+1

BitBlt एक डीसी से दूसरे में प्रतियां:

कोड यह रहा। डीसी पर बिटमैप खींचने के लिए, आप स्रोत डीसी में बिटमैप का चयन करते हैं और फिर इसे गंतव्य पर बिट करें। यदि आप जीडीआई + 'बिटमैप' ऑब्जेक्ट के साथ ऐसा करना चाहते हैं, तो क्या आपको केवल 'ग्राफिक्स.ड्राइमेज' का उपयोग नहीं करना चाहिए, जहां 'ग्राफिक्स' ऑब्जेक्ट लक्षित लक्ष्य डीसी को लपेटता है? एक 'एचबीटममैप' के माध्यम से क्यों जाना है? –

+1

जिस कारण से मुझे बिटबल्ट की आवश्यकता है, वह इसके रास्टर ऑपरेशंस के लिए है। DrawImage एक छवि से दूसरे में एक या ऑपरेशन नहीं कर सकता है। और मैंने इसे जीडीआई बिटमैप्स के साथ किया है, लेकिन मैं एक एचडीआई + बिटमैप को एचडीसी में कैसे चुन सकता हूं? मैं वास्तव में जानना चाहता हूं कि यह संभव है या नहीं। – jnm2

उत्तर

6

दिनों के लिए खोज करने के बाद, अचानक मुझे मारा कि जवाब हर समय चेहरे पर मुझे देख रहा था! मैं एक पॉइंटर से एक बाइट सरणी में एक जीडीआई + बिटमैप बना रहा था। फिर एक ही सूचक का उपयोग कर एक एचबीआईटीएमएपी बनाने की कोशिश कर रहा है। लेकिन मैं पहले ही आसानी से एचबीआईटीएमएपी बना सकता था और जीडीआई + बिटमैप बनाने के लिए उस से पॉइंटर का उपयोग कर सकता था।

यह एक आकर्षण की तरह काम करता है! हालांकि आप चाहें तो जीडीआई और जीडीआई + ऑपरेशंस को मिला सकते हैं। छवि एक बार में सादा जीडीआई और जीडीआई + दोनों है। DrawImage का उपयोग करने के बजाय, आप सटीक उसी पिक्सेल डेटा से बिटबल्ट कर सकते हैं!

// Create the HBITMAP 
BITMAPINFO binfo = new BITMAPINFO(); 
binfo.biSize = (uint)Marshal.SizeOf(typeof(BITMAPINFO)); 
binfo.biWidth = width; 
binfo.biHeight = height; 
binfo.biBitCount = (ushort)Image.GetPixelFormatSize(pixelFormat); 
binfo.biPlanes = 1; 
binfo.biCompression = 0; 

hDC = CreateCompatibleDC(IntPtr.Zero); 

IntPtr pointer; 
hBitmap = CreateDIBSection(hDC, ref binfo, 0, out pointer, IntPtr.Zero, 0); 

// Create the GDI+ bitmap using the pointer returned from CreateDIBSection 
gdiBitmap = new Bitmap(width, height, width * binfo.biBitCount >> 3, pixelFormat, pointer); 
संबंधित मुद्दे