Como devo traduzir as coordenadas de espaço de tela para o espaço coordenadas de imagem em um WinForms PictureBox?

votos
13

Eu tenho um aplicativo que exibe uma imagem dentro de um Windows Forms PictureBoxcontrole. A SizeModedo controle é definido como Zoompara que a imagem contida no PictureBoxvai ser exibido de forma aspecto correcta-, independentemente das dimensões da PictureBox.

Isso é ótimo para o aspecto visual da aplicação, pois você pode tamanho da janela como quiser ea imagem sempre será exibido usando o seu melhor ajuste. Infelizmente, eu também preciso para lidar com eventos de clique do mouse na caixa de imagem e precisa ser capaz de traduzir as coordenadas de tela-espaço para coordenadas espaço imagem.

Parece que é fácil de tradução do espaço na tela para controlar o espaço, mas eu não vejo nenhuma maneira óbvia para traduzir a partir do espaço de controle para o espaço imagem (ou seja, a coordenada de pixel na imagem de origem que foi escalado na caixa de imagem).

Existe uma maneira fácil de fazer isso, ou eu deveria apenas duplicar a matemática escala que eles estão usando internamente para posicionar a imagem e fazer a tradução me?

Publicado 05/08/2008 em 21:28
fonte usuário
Em outras línguas...                            


2 respostas

votos
6

I machucar apenas implementar a tradução manualmente. O código não é muito ruim, mas me deixou desejando que eles forneceram suporte para ele diretamente. Eu podia ver tal método ser útil em muitas circunstâncias diferentes.

Eu acho que é por isso que eles adicionaram os métodos de extensão :)

Em pseudocódigo:

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

Para obter a posição de pixels na imagem, você só multiplicar por as dimensões reais do pixel de imagem, mas as coordenadas normalizadas permitem abordar ponto da resposta inicial sobre como resolver a ambiguidade numa base caso-a-caso.

Respondeu 06/08/2008 em 05:25
fonte usuário

votos
1

Dependendo da escala, o pixel da imagem em relação poderia estar em qualquer lugar em um número de pixels. Por exemplo, se a imagem foi reduzida significativamente, pixel 2, 10 poderia representar 2, 10 todo o caminho até 20, 100), de forma que você tem que fazer as contas a si mesmo e assumir total responsabilidade por qualquer falha! :-)

Respondeu 05/08/2008 em 21:33
fonte usuário

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