Πώς μπορώ να μεταφράσει από το διάστημα οθόνης συντεταγμένες στο διάστημα συντεταγμένες εικόνας σε WinForms PictureBox;

ψήφοι
13

Έχω μια εφαρμογή που εμφανίζει μια εικόνα μέσα σε ένα Μορφές των Windows PictureBoxελέγχου. Η SizeModeτου ελέγχου είναι ρυθμισμένη σε Zoomέτσι ώστε η εικόνα που περιέχεται στο η PictureBoxθα εμφανιστεί σε μια πτυχή-σωστό τρόπο, ανεξάρτητα από τις διαστάσεις του PictureBox.

Αυτό είναι μεγάλο για την εμφάνιση της εφαρμογής, επειδή μπορείτε να το μέγεθος του παραθύρου όπως θέλετε και η εικόνα θα εμφανίζεται πάντα χρησιμοποιώντας την καλύτερη εφαρμογή του. Δυστυχώς, θα πρέπει επίσης να χειριστεί κλικ του ποντικιού εκδηλώσεις στο κουτί εικόνα και πρέπει να είναι σε θέση να μεταφράσει από την οθόνη χώρο συντεταγμένες σε συντεταγμένες εικόνας-χώρου.

Φαίνεται σαν να είναι εύκολο να μεταφράσει από χώρο στην οθόνη για τον έλεγχο της χώρο, αλλά δεν βλέπω καμία προφανής τρόπος για να μεταφράσει από το διάστημα τον έλεγχο στο διάστημα της εικόνας (δηλαδή το pixel συντεταγμένων στην εικόνα προέλευσης που έχει κλιμακωθεί στο πλαίσιο εικόνα).

Υπάρχει ένας εύκολος τρόπος για να γίνει αυτό, ή θα έπρεπε εγώ απλά επαναλαμβάνουν τα μαθηματικά κλιμάκωση ότι χρησιμοποιούν εσωτερικά για να τοποθετήσετε την εικόνα και να κάνει τη μετάφραση εαυτό μου;

Δημοσιεύθηκε 05/08/2008 στις 21:28
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
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)

Για να πάρει την θέση του pixel στην εικόνα, τότε θα πρέπει απλά πολλαπλασιάστε με τις πραγματικές διαστάσεις pixel της εικόνας, αλλά οι κανονικοποιημένες συντεταγμένες σας επιτρέψει να αντιμετωπίσει το σημείο της αρχικής ανταπόκρισης του σχετικά με την επίλυση ασάφεια για κάθε περίπτωση χωριστά.

Απαντήθηκε 06/08/2008 στις 05:25
πηγή χρήστη

ψήφοι
1

Ανάλογα με την κλιμάκωση, η σχετική pixel εικόνα θα μπορούσε να είναι οπουδήποτε στον αριθμό των pixels. Για παράδειγμα, αν η εικόνα έχει μειωθεί σημαντικά, pixel 2, 10 θα μπορούσε να αποτελέσει 2, 10 σε όλη τη διαδρομή μέχρι το 20, 100), έτσι θα πρέπει να κάνετε τα μαθηματικά τον εαυτό σας και να αναλάβει την πλήρη ευθύνη για τυχόν ανακρίβειες! :-)

Απαντήθηκε 05/08/2008 στις 21:33
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more