كيف يمكنني الترجمة من إحداثيات مساحة الشاشة إلى إحداثيات مساحة الصورة في WinForms PictureBox؟

StackOverflow https://stackoverflow.com/questions/2804

  •  08-06-2019
  •  | 
  •  

سؤال

لدي تطبيق يعرض صورة داخل نماذج Windows PictureBox يتحكم.ال SizeMode تم ضبط عنصر التحكم على Zoom بحيث الصورة الواردة في PictureBox سيتم عرضه بطريقة صحيحة بغض النظر عن أبعاد PictureBox.

يعد هذا أمرًا رائعًا بالنسبة للمظهر المرئي للتطبيق لأنه يمكنك تغيير حجم النافذة كما تريد وسيتم عرض الصورة دائمًا باستخدام أفضل ملاءمة لها.لسوء الحظ، أحتاج أيضًا إلى التعامل مع أحداث النقر بالماوس على مربع الصورة وأحتاج إلى أن أكون قادرًا على الترجمة من إحداثيات مساحة الشاشة إلى إحداثيات مساحة الصورة.

يبدو أنه من السهل الترجمة من مساحة الشاشة إلى مساحة التحكم، لكنني لا أرى أي طريقة واضحة للترجمة من مساحة التحكم إلى مساحة الصورة (أي.إحداثيات البكسل في الصورة المصدر التي تم تغيير حجمها في مربع الصورة).

هل هناك طريقة سهلة للقيام بذلك، أم يجب علي فقط تكرار حسابات القياس التي يستخدمونها داخليًا لتحديد موضع الصورة وإجراء الترجمة بنفسي؟

هل كانت مفيدة؟

المحلول

اعتمادًا على القياس، يمكن أن تكون بكسل الصورة النسبية في أي مكان في عدد من وحدات البكسل.على سبيل المثال، إذا تم تصغير الصورة بشكل كبير، يمكن أن يمثل البكسل 2، 10 2، 10 حتى 20، 100)، لذا سيتعين عليك إجراء الحسابات بنفسك وتحمل المسؤولية الكاملة عن أي أخطاء غير دقيقة!:-)

نصائح أخرى

لقد انتهيت من تنفيذ الترجمة يدويًا.الكود ليس سيئًا للغاية، لكنه جعلني أتمنى أن يقدموا الدعم له بشكل مباشر.أستطيع أن أرى أن مثل هذه الطريقة مفيدة في الكثير من الظروف المختلفة.

أعتقد أن هذا هو سبب إضافة طرق التمديد :)

في الكود الزائف:

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

للحصول على موضع البكسل في الصورة، ما عليك سوى الضرب في أبعاد البكسل الفعلية للصورة، لكن الإحداثيات المقيسة تسمح لك بمعالجة نقطة المستجيب الأصلي حول حل الغموض على أساس كل حالة على حدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top