繁体   English   中英

放大图片框中的图像

[英]Zoom Image in Picture Box

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

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

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

码:

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#

等待答复!

由DevExpress 13.2提供的PictureEdit控件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM