Ampliando / esticando uma caixa de imagem na posição atual do mouse?

P: Como posso implementar o zoom na posição atual do mouse sobre uma caixa de imagem, algo como o zoom no Google Maps?

Eu estou projetando um mecanismo simples de GIS / mapa como meu trabalho de tese. O aplicativo é projetado de tal forma que os mapas estão sendo carregados em guias de um controle de tabulação modificado de forma abreviada.

Os mapas são imagens digitais no formato JPEG ou PNG padrão e a maioria deles tem resoluções muito altas (2000x2000px e acima).

Eles são carregados em pictureboxes que são adicionados como subcontroles de tabuinhas. Implementei um método de zoom simples como um evento de clique de botão que apenas aproxima o centro da imagem / picturebox.

O que eu gostaria de fazer é implementar o zoom em um evento mousewheel dessa forma que a imagem está sendo ampliada na posição atual do mouse dentro do picturebox.

O código para zoom atualmente está assim:

            timesZoomed += 1;
            zoomRatio += 0.1f;
            pbxMapa.Width = pbxMapa.Width * zoomRatio;
            pbxMapa.Height = pbxMapa.Height * zoomRatio;
            pbxMapa.Location = new Point((this.Width / 2) - (pbxMapa.Width / 2), this.Height / 2) - (pbxMapa.Height / 2));
O valor padrão "zoomRatio" é 1, e está sendo aumentado para 0.6f.Argumento valor padrão "timesZoomed" é 0, vai até 6."pbxMapa" é o picturebox com a imagem carregada do mapa. O "ImageSizeMode" prop da caixa de imagem está definido como "Zoom", mas o tamanho da caixa de imagem é definido como o tamanho total da imagem do mapa carregada.

Além disso, eu estava experimentando com este código de zoom simples. O cálculo é um pouco eficaz, mas ainda assim tem um grande deslocamento quando ampliando / multiplicando com uma proporção maior:

                pbxMapa.Location = new Point(pbxMapa.Location.X + (int)((pbxMapa.Location.X * zoomRatio - mouseXPbx) / 8), pbxMapa.Location.Y + (int)((pbxMapa.Location.Y * zoomRatio - mouseYPbx) / 8));
As variáveis ​​"mouseXPbx" e ​​"mouseYPbx" representam a posição atual do mouse dentro do "pbxMapa". Eu dividi por 8 para minimizar o deslocamento no posicionamento.

Qualquer ajuda e sugestões é apreciada, obrigado antecipadamente.

questionAnswers(2)

yourAnswerToTheQuestion