3

我正在创建一个应用程序,用户将能够在其中上传图像,然后在特定位置(当前鼠标指针)放大和缩小图像。

当图像被缩放时,用户还应该能够拖动图像以查看图像的其他部分。

我已经实现了一些功能来实现它,但我正在缩放整个图像。我想知道如何缩放图像的特定部分,或缩放整个图像,然后指向当前鼠标指针所在的位置。

代码:

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 事件中获取当前鼠标位置,并尝试在仅完成缩放时翻译图片,但这不起作用。

此外,图片框里面还有一些其他的多个图片框,以在大图像上显示一些表示。缩放大图像时,不应缩放小图像(内部图像)。尽管即使在放大大图像后也需要重新计算位置以将它们显示在真实位置。

所以在上面我面临两个问题:

1)通过滚动在任何特定位置(当前鼠标指针)缩放图像。

2)在缩放和平移时重新生成子图像的坐标。

任何可以指导我正确方向的帮助。

另外,如果通过任何其他方式,我可以实现此功能。

应用:窗户

控件:图片框(请建议是否可以使用任何其他控件,如果无法使用此控件)

语言:C#

等待答复!

4

1 回答 1

1

DevExpress 13.2 提供的 PictureEdit 控件

于 2013-10-09T09:48:40.910 回答