放大图片框中的图像

时间:2013-09-02 08:02:14

标签: c# winforms image devexpress picturebox

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

此外,用户应该能够在缩放图像时拖动图像以查看图像的其他部分。

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

代码:

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#

等待回复!

1 个答案:

答案 0 :(得分:1)

DevEpress 13.2提供的PictureEdit控件