缩放图片在图片框中

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事件中获取当前鼠标位置,并且在进行缩放时尝试翻译图片,但是这并不起作用。
此外,PictureBox内还有其他多个PictureBox,用于显示大图像上的某些表示。在缩放大图像时,小图像(内部图像)不应缩放。虽然它们的位置需要重新计算,以便在对大图像进行缩放后仍能在其实际位置上显示它们。
因此,我面临两个问题:
1)通过滚动来在任何特定位置(当前鼠标指针)缩放图像。
2)在缩放和平移时重新生成子图像的坐标。
请帮助我找到正确的方向。
如果通过其他方式,我也可以实现此功能。
应用程序:Windows
控件:PictureBox(如果不能使用,请建议其他控件)
语言:C#
等待您的回复!

看看这个链接是否对你有帮助:http://www.codeproject.com/Articles/15373/A-scrollable-zoomable-and-scalable-picture-box - devavx
@AviralSingh:我已经查看了那个链接,但不幸的是那不是我想要实现的。也许需要对上面的代码进行一些修改,因为它与需求完全不同。 - Lokesh
这个链接可能对你有所帮助:这里 - Naren
谢谢@Naren提供链接,它可以缩放到特定区域。但这种方法的问题在于只是重新创建了图像中的特定区域,而没有对整个图像进行比例缩放。因此,在缩放后,我们将无法在图片框中看到完整的图像。由于这个原因,当用户实现缩放时,将无法探索图像的所有其他部分。 - Lokesh
1个回答

1

DevExpress 13.2提供的PictureEdit控件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接