Como devo traduzir a partir do ecrã do espaço de coordenadas de imagem espaço de coordenadas em um WinForms PictureBox?

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

  •  08-06-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo que exibe uma imagem dentro de um Windows Forms PictureBox o controle.O SizeMode do controlo está definida para Zoom para que a imagem contida no PictureBox vai ser apresentada em um aspecto-maneira correta, independentemente das dimensões do PictureBox.

Isso é ótimo para a aparência visual do aplicativo, pois você pode redimensionar a janela como quiser e a imagem sempre será exibido usando o seu melhor ajuste.Infelizmente, eu também precisa lidar com eventos de clique do mouse sobre a caixa de imagem e precisa ser capaz de traduzir a partir do ecrã do espaço de coordenadas de imagem-espaço de coordenadas.

Olha como é fácil traduzir de espaço na tela para controlar o espaço, mas não vejo qualquer maneira óbvia para traduzir de controle de espaço de espaço de imagem (i.e.o pixel de coordenadas da imagem de origem que tem sido escalado na caixa de imagem).

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

Foi útil?

Solução

Dependendo da escala, relativa pixel da imagem pode ser em qualquer lugar em número de pixels.Por exemplo, se a imagem está reduzida significativamente, pixel 2, 10, poderia representar 2, 10 até 20, 100), então você vai ter que fazer as contas de si mesmo e assumir total responsabilidade por quaisquer imprecisões!:-)

Outras dicas

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

Eu acho que é por isso que eles adicionados 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 do pixel na imagem, você tinha acabado de se multiplicar por imagem real dimensões de pixel, mas normalizados de coordenadas permitir-lhe para o endereço original do respondente ponto sobre a resolução de ambigüidade em um caso-a-caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top