WinForms PictureBox में छवि स्थान निर्देशांक में स्क्रीन स्पेस निर्देशांक से मुझे अनुवाद कैसे करना चाहिए?

मेरे पास एक ऐसा एप्लिकेशन है जो एक विंडोज़ फॉर्म <�कोड> पिक्चरबॉक्स नियंत्रण के अंदर एक छवि प्रदर्शित करता है। नियंत्रण के SizeMode को ज़ूम पर सेट किया गया है ताकि PictureBox में निहित छवि को पहलू-सही तरीके से प्रदर्शित किया जा सके Picturebox के आयाम।

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

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

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

0
जोड़ा संपादित
विचारों: 5

2 उत्तर

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

0
जोड़ा

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

मुझे लगता है कि यही कारण है कि उन्होंने विस्तार विधियों को जोड़ा :)

छद्म कोड में:

// 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)

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

0
जोड़ा
निश्चित बात, मैंने इसे अपनी प्रतिक्रिया में संपादित किया
जोड़ा लेखक fastcall, स्रोत
हाय, आपके पास अभी भी हाथ रखने के लिए कोड के नमूने को देखना बहुत अच्छा होगा।
जोड़ा लेखक Kevin Wilson, स्रोत