2008-08-05 10 views
13

मेरे पास एक ऐसा एप्लिकेशन है जो एक विंडोज़ फॉर्म PictureBox नियंत्रण के अंदर एक छवि प्रदर्शित करता है। नियंत्रण के SizeMode को Zoom पर सेट किया गया है ताकि PictureBox में निहित छवि PictureBox के आयामों पर ध्यान दिए बिना एक पहलू-सही तरीके से प्रदर्शित की जाएगी।WinForms PictureBox में छवि स्थान निर्देशांक में स्क्रीन स्पेस निर्देशांक से मुझे अनुवाद कैसे करना चाहिए?

यह एप्लिकेशन की दृश्य उपस्थिति के लिए बहुत अच्छा है क्योंकि आप विंडो को आकार दे सकते हैं हालांकि आप चाहते हैं और छवि हमेशा अपने सर्वश्रेष्ठ फिट का उपयोग करके प्रदर्शित की जाएगी। दुर्भाग्यवश, मुझे चित्र बॉक्स पर माउस क्लिक इवेंट्स को संभालने की भी आवश्यकता है और स्क्रीन-स्पेस निर्देशांक से छवि-स्थान निर्देशांक में अनुवाद करने में सक्षम होने की आवश्यकता है।

ऐसा लगता है कि स्क्रीन स्पेस से स्थान को नियंत्रित करने के लिए अनुवाद करना आसान है, लेकिन मुझे नियंत्रण स्थान से छवि स्थान (यानी स्रोत छवि में पिक्सेल समन्वय का अनुवाद करने का कोई स्पष्ट तरीका नहीं दिखता है) चित्र बॉक्स)।

क्या ऐसा करने का कोई आसान तरीका है, या क्या मुझे स्केलिंग गणित को डुप्लिकेट करना चाहिए कि वे छवि को स्थिति देने और अनुवाद करने के लिए आंतरिक रूप से उपयोग कर रहे हैं?

उत्तर

1

स्केलिंग के आधार पर, सापेक्ष छवि पिक्सेल कई पिक्सेल में कहीं भी हो सकती है। उदाहरण के लिए, यदि छवि को काफी नीचे घटाया गया है, तो पिक्सेल 2, 10 2, 10 तक 20, 100 तक सभी तरह का प्रतिनिधित्व कर सकता है), इसलिए आपको स्वयं गणित करना होगा और किसी भी गलतियों के लिए पूर्ण ज़िम्मेदारी लेनी होगी! :-)

6

मैं मैन्युअल रूप से अनुवाद को लागू करने के लिए घायल हो गया। कोड बहुत बुरा नहीं है, लेकिन उसने मुझे यह छोड़ दिया कि उन्होंने इसके लिए समर्थन प्रदान किया। मैं ऐसी कई विधियों को कई अलग-अलग परिस्थितियों में उपयोगी देख सकता था। वैसे ही गुणा वास्तविक छवि पिक्सेल आयाम द्वारा

// Recompute the image scaling the zoom mode uses to fit the image on screen 
imageScale ::= min(pictureBox.width/image.width, pictureBox.height/image.height) 

scaledWidth ::= image.width * imageScale 
scaledHeight ::= image.height * imageScale 

// Compute the offset of the image to center it in the picture box 
imageX ::= (pictureBox.width - scaledWidth)/2 
imageY ::= (pictureBox.height - scaledHeight)/2 

// Test the coordinate in the picture box against the image bounds 
if pos.x < imageX or imageX + scaledWidth < pos.x then return null 
if pos.y < imageY or imageY + scaledHeight < pos.y then return null 

// Compute the normalized (0..1) coordinates in image space 
u ::= (pos.x - imageX)/imageScale 
v ::= (pos.y - imageY)/imageScale 
return (u, v) 

छवि में पिक्सेल स्थिति पाने के लिए आपको, लेकिन:

मुझे लगता है कि क्यों वे विस्तार तरीकों :)

स्यूडोकोड में कहा कि है सामान्यीकृत निर्देशांक आपको केस-दर-मामले आधार पर अस्पष्टता को हल करने के बारे में मूल उत्तरदाता के बिंदु को संबोधित करने की अनुमति देते हैं।

+1

नमस्ते, यदि आपके पास अभी भी हाथ है तो कोड के नमूने को देखना बहुत अच्छा होगा। –

+1

निश्चित बात, मैंने इसे अपनी प्रतिक्रिया में संपादित किया – fastcall