Jak mám překládat z místa na obrazovce souřadnic obrazového prostoru souřadnic v WinForms PictureBox?

hlasů
13

Mám aplikaci, která zobrazuje obraz uvnitř Windows Forms PictureBoxovládacího prvku. SizeModeOvládacího prvku je nastavena Zoomtak, aby obraz obsahoval v PictureBoxzobrazí v poměru stran korektní způsobem bez ohledu na rozměry PictureBox.

To je skvělé pro vizuální vzhled aplikace, protože si můžete upravit velikost okna se však chcete, a obraz bude vždy zobrazena pomocí jeho nejvhodnější. Bohužel jsem také potřebují zvládnout myši akcí na poli obrázek a musí být schopni překládat z obrazovky prostoru souřadnic do obrazu prostorových souřadnic.

Vypadá to, že je to snadné překládat z prostoru obrazovky ovládat prostor, ale já nevidím žádný zřejmý způsob, jak překládat z ovládacího prostoru do prostoru obrazu (tj pixel souřadnic ve zdrojovém obrazu, který byl zmenšen na poli obrázek).

Existuje jednoduchý způsob, jak to udělat, nebo mám jen duplikovat měřítka matematiku, že používáte interně umístit obraz a udělat překlad sám?

Položena 05/08/2008 v 21:28
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
6

Nakonec jsem prostě provádění překladu ručně. Tento kód není příliš špatný, ale to nech mě, který si přeje, aby poskytla podporu pro něj přímo. Viděl jsem takový způsob je užitečný v mnoha různých okolností.

Myslím, že to je důvod, proč oni přidali rozšíření metody :)

V pseudokódu:

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

Chcete-li získat pozici pixel v obraze, kterou stačí vynásobit skutečných rozměrů obrazu v obrazových bodech, ale normalizované poloha umožňuje řešit bod originálem odpovídač je o vyřešení nejednoznačnosti případ od případu.

Odpovězeno 06/08/2008 v 05:25
zdroj uživatelem

hlasů
1

V závislosti na škálování, relativní obraz pixel může být kdekoliv v počtu pixelů. Například, pokud je obraz zmenšen významně pixel 2, 10 může představovat 2, 10 po celou cestu až do 20, 100), takže budete muset udělat matematiku sami a převzít plnou odpovědnost za případné nepřesnosti! :-)

Odpovězeno 05/08/2008 v 21:33
zdroj uživatelem

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