Vă mulțumim pentru susținere

Cum ar trebui să traduc din coordonatele spațiului de ecran la coordonatele spațiului imagine într-o WinForms PictureBox?

Am o aplicație care afișează o imagine în interiorul unui control Windows Forms PictureBox . Codul SizeMode al comenzii este setat la Zoom astfel încât imaginea conținută în PictureBox să fie afișată într-un mod corect, indiferent de dimensiunile PictureBox .

Acest lucru este minunat pentru aspectul vizual al aplicației, deoarece puteți mări fereastra oricum doriți și imaginea va fi afișată întotdeauna cu cea mai bună potrivire. Din păcate, trebuie să mă ocup de evenimentele de pe mouse-ul din caseta de imagini și trebuie să fie capabil să traducă din coordonatele spațiului de ecran la coordonatele spațiului imagine.

Se pare că este ușor să traduceți din spațiul de pe ecran pentru a controla spațiul, dar nu văd nici o modalitate evidentă de a traduce din spațiul de control spre spațiul de imagine (adică coordonatele pixelilor din imaginea sursă care a fost scalată în caseta de imagine).

Există o modalitate ușoară de a face acest lucru sau ar trebui să repet minte matematica pe care o folosesc intern pentru a poziționa imaginea și a face traducerea singură?

0
adăugat editat

2 răspunsuri

În funcție de scalare, pixelul imaginii relative ar putea fi oriunde într-un număr de pixeli. De exemplu, în cazul în care imaginea este redusă semnificativ, pixelul 2, 10 ar putea reprezenta 2, 10 până la 20, 100), astfel încât va trebui să faceți personal matematica și să vă asumați întreaga responsabilitate pentru orice inexactități! :-)

0
adăugat

Am terminat doar implementarea manuală a traducerii. Codul nu e prea rău, dar mi-a lăsat să doresc ca ei să-i ofere sprijin direct. Am putut vedea o astfel de metodă utilă într-o mulțime de circumstanțe diferite.

Cred că de asta au adăugat metode de extensie :)

În pseudocod:

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

Pentru a obține poziția pixelului în imagine, vă înmulțiți numai prin dimensiunile efective ale pixelilor de imagine, dar coordonatele normalizate vă permit să abordați punctul de răspuns al inițialului cu privire la rezolvarea ambiguității de la caz la caz.

0
adăugat
Sigur, l-am editat în răspunsul meu
adăugat autor fastcall
Bună, ar fi minunat să vedeți un eșantion din codul pe care l-ați pus împreună dacă îl aveți în continuare la îndemână.
adăugat autor Kevin Wilson