C# 在图片框中缩放图像

C# 在图片框中缩放图像,c#,winforms,image,devexpress,picturebox,C#,Winforms,Image,Devexpress,Picturebox,我正在创建一个应用程序,在这个应用程序中,用户可以上传图像,然后在特定位置(当前鼠标指针)放大和缩小图像 此外,当图像缩放时,用户应该能够拖动图像以查看图像的其他部分 我已经实现了一些功能来实现它,但我正在缩放整个图像。我想知道如何缩放图像的特定部分,或者缩放整个图像,然后指向当前鼠标指针所在的位置 代码: private void DisplayIsdDiagram(BO.IsdDiagram IsdDiagram) { DoubleBuffered = true; zoomF

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

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

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

代码:

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);
}
private void DisplayIsdDiagram(BO.IsdDiagram-IsdDiagram)
{
双缓冲=真;
zoomFac=1;
translateX=0;
translateY=0;
transStartX=0f;
transStartY=0f;
picIsdDiagram.BorderStyle=BorderStyle.Fixed3D;
bmp=新位图(Image.FromStream(新内存流(IsdDiagram.Image.ToArray()));
如果(bmp.Width>bmp.Height)
{
比率=(浮点)picIsdDiagram.Width/(浮点)bmp.Width;
translateRatio=(float)bmp.Width/(float)picIsdDiagram.Width;
}
其他的
{
比率=(浮点)picIsdDiagram.Height/(浮点)bmp.Height;
translateRatio=(float)bmp.Height/(float)picIsdDiagram.Height;
}
//picIsdDiagram.Image=bmp;
picIsdDiagram.Refresh();
picIsdDiagram.MouseWheel+=新的MouseEventHandler(picIsdDiagram\u MouseWheel);
}
专用void picIsdDiagram_鼠标滚轮(对象发送器,鼠标指针e)
{
IsZooming=true;
如果(e.Delta<0)
{
如果(zoomFac>1)
zoomFac=zoomFac-(float)0.1;
}
其他的
{

如果(zoomFacPictureEdit控件,由DevExpress 13.2提供,请查看是否对您有帮助。@Avirasing:我已经浏览了该链接,但不幸的是,这不是我想要实现的。可能是如果对上述代码进行了一些修改,因为这与要求完全不同。可能会对您有所帮助。。感谢@Naren提供此链接,它实际上会放大一个特定的区域。但这种方法的问题是,它只在图像上重新创建一个特定的区域,而没有缩放图像。因此,缩放后,图片框中不会有完整的图像。因此,当实现缩放时,用户将无法浏览图像的所有其他部分。