我正在创建一个应用程序,用户可以在其中上传图像,然后在特定位置放大和缩小图像(当前鼠标指针)。
此外,用户应该能够在缩放图像时拖动图像以查看图像的其他部分。
我已经实现了一些功能来实现它,但我正在缩放整个图像。我想知道如何缩放图像的特定部分,或缩放整个图像,然后指向放置当前鼠标指针的位置。
代码:
private void DisplayIsdDiagram(BO.IsdDiagram IsdDiagram)
{
DoubleBuffered = true;
zoomFac = 1;
translateX = 0;
translateY = 0;
transStartX = 0f;
transStartY = 0f;
picIsdDiagram.BorderStyle = BorderStyle.Fixed3D;
bmp = new Bitmap(Image.FromStream(new MemoryStream(IsdDiagram.Image.ToArray())));
if (bmp.Width > bmp.Height)
{
ratio = (float)picIsdDiagram.Width / (float)bmp.Width;
translateRatio = (float)bmp.Width / (float)picIsdDiagram.Width;
}
else
{
ratio = (float)picIsdDiagram.Height / (float)bmp.Height;
translateRatio = (float)bmp.Height / (float)picIsdDiagram.Height;
}
//picIsdDiagram.Image = bmp;
picIsdDiagram.Refresh();
picIsdDiagram.MouseWheel += new MouseEventHandler(picIsdDiagram_MouseWheel);
}
private void picIsdDiagram_MouseWheel(object sender, MouseEventArgs e)
{
IsZooming = true;
if (e.Delta < 0)
{
if (zoomFac > 1)
zoomFac = zoomFac - (float)0.1;
}
else
{
if (zoomFac <= 5)
zoomFac = zoomFac + (float)0.1;
}
picIsdDiagram.Refresh();
IsZooming = false;
}
private void picIsdDiagram_MouseDown(object sender, MouseEventArgs e)
{
IsZooming = false;
IsMouseDown = true;
transStartX = e.X;
transStartY = e.Y;
}
private void picIsdDiagram_MouseUp(object sender, MouseEventArgs e)
{
IsZooming = false;
IsMouseDown = false;
translateX = translateX + ((e.X - transStartX) * (translateRatio / zoomFac));
translateY = translateY + ((e.Y - transStartY) * (translateRatio / zoomFac));
picIsdDiagram.Refresh();
}
private void picIsdDiagram_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.ScaleTransform(ratio * zoomFac, ratio * zoomFac);
if (IsZooming == false && IsMouseDown == true)
g.TranslateTransform(translateX, translateY);
g.DrawImage(bmp, 0, 0);
}
我尝试从MouseHover事件获取当前鼠标位置,并尝试仅在完成缩放时翻译图片,但这不起作用。
此外,Picture Box中还有一些其他多个图片框,用于在大图像上显示一些图像。缩放大图像时,不应缩放小图像(内部图像)。虽然需要重新计算位置,即使在放大图像后也可以在真实位置显示它们。
所以在上面我面临两个问题:
1)在任何特定位置放大图像(当前鼠标指针) 通过滚动。
2)同时重新生成子图像的坐标 缩放和翻译。
任何可以指导我正确方向的帮助。
此外,如果通过任何其他方式,我可以实现此功能。
应用程序:Windows
控制:图片框(如果不能使用,请建议是否可以使用任何其他控件)
语言:C#
等待回复!
答案 0 :(得分:1)
DevEpress 13.2提供的PictureEdit控件