简体   繁体   English

使用鼠标拖动调整图像大小(C#)

[英]Resizing an image using mouse dragging (C#)

I'm having some trouble resizing an image just by dragging the mouse. 仅通过拖动鼠标来调整图像大小会遇到一些麻烦。 I found an average resize method and now am trying to modify it to use the mouse instead of given values. 我找到了一种平均调整大小的方法,现在正尝试将其修改为使用鼠标而不是给定的值。

The way I'm doing it makes sense to me but maybe you guys can give me some better ideas. 我的做法对我来说很有意义,但也许你们可以给我一些更好的想法。 I'm basically using the distance between the current location of the mouse and the previous location of the mouse as the scaling factor. 我基本上是将鼠标当前位置和鼠标先前位置之间的距离用作缩放因子。 If the distance between the current mouse location and the center of of the image is less than the distance between previous mouse location and the center of the image then the image gets smaller, and vice-versa. 如果当前鼠标位置和图像中心之间的距离小于先前鼠标位置和图像中心之间的距离,则图像变小,反之亦然。

With the code below I'm getting an Argument Exception (invalid parameter) when creating the new bitmap with the new height and width and I really don't understand why... any ideas? 在下面的代码中,使用新的高度和宽度创建新的位图时,出现了参数异常(参数无效),我真的不明白为什么...有什么想法吗?

---------------------------------EDIT------------------------------------------------------ - - - - - - - - - - - - - - - - -编辑 - - - - - - - - --------------------------------------

Ok, thanks to Aaronaught the exception problem has been fixed and I updated the code below. 好的,感谢Aaronaught,异常问题已得到解决,我更新了以下代码。 Now I'm having a problem making the resize look smooth and finding a way to keep it from distorting to the point that you can't recognize the picture after resizing it multiple times. 现在,我遇到了使调整大小看上去平滑的问题,并且找到了一种方法来防止其变形,以至于在多次调整大小后无法识别图片。

My idea for keeping it from distorting is to change it back to the original image when it is within a certain range of sizes; 我要防止失真的想法是,当图像在一定大小范围内时,将其更改回原始图像。 but I'm not too sure how I would make that work without it looking wierd. 但是我不太确定如何在不显得奇怪的情况下进行这项工作。 Here's the updated code: 这是更新的代码:

private static Image resizeImage(Image imgToResize, System.Drawing.Point prevMouseLoc, System.Drawing.Point currentMouseLoc)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;
        float dCurrCent = 0;
        float dPrevCent = 0;
        float dCurrPrev = 0;
        bool increase = true;
        System.Drawing.Point imgCenter = new System.Drawing.Point();
        float nPercent = 0; 

        imgCenter.X = imgToResize.Width / 2;
        imgCenter.Y = imgToResize.Height / 2;

        // Calculating the distance between the current mouse location and the center of the image
        dCurrCent = (float)Math.Sqrt(Math.Pow(currentMouseLoc.X - imgCenter.X, 2) + Math.Pow(currentMouseLoc.Y - imgCenter.Y, 2));

        // Calculating the distance between the previous mouse location and the center of the image
        dPrevCent = (float)Math.Sqrt(Math.Pow(prevMouseLoc.X - imgCenter.X, 2) + Math.Pow(prevMouseLoc.Y - imgCenter.Y, 2));

        // Setting flag to increase or decrease size
        if (dCurrCent >= dPrevCent)
        {
            increase = true;
        }
        else
        {
            increase = false;
        }

        // Calculating the scaling factor
        dCurrPrev = nPercent = (float)Math.Sqrt(Math.Pow(currentMouseLoc.X - prevMouseLoc.X, 2) + Math.Pow(currentMouseLoc.Y - prevMouseLoc.Y, 2));

        if (increase)
        {
            nPercent = (float)dCurrPrev;
        }
        else
        {
            nPercent = (float)(1 / dCurrPrev);
        }

        // Calculating the new height and width of the image
        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        // Create new bitmap, resize image (within limites) and return it
        if (nPercent != 0 && destWidth > 100 && destWidth < 600)
        {
            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();

            return (Image)b;
        }
        else
            return imgToResize;
    }

To minimize distortion, you need to figure out the difference between the actual size of the image and the new size of the image and always create the re-sized image from the original image. 为了最大程度地减少失真,您需要弄清楚图像的实际尺寸与图像的新尺寸之间的差异,并始终根据原始图像创建调整大小后的图像。 Whenever the image size changes, call Refresh on the control that you are drawing the image on. 每当图像大小改变时,在绘制图像的控件上调用“ Refresh ”。

By the way, a PictureBox control with its SizeMode set to PictureBoxSizeMode.Zoom can handle the image resizing for you. 顺便说一句,将其SizeMode设置为PictureBoxSizeMode.ZoomPictureBox控件可以为您调整图像大小。 Your code to re-size would only need to re-size the PictureBox. 您要调整大小的代码只需要调整PictureBox的大小即可。 (Of course, it may not make sense to use a control in your situation, but I thought I would let you know just in case). (当然,在您所处的环境中使用控件可能没有意义,但我想以防万一。)

What happens if the mouse hasn't moved at all? 如果鼠标根本不动怎么办? You're not handling the case where nPercent evaluates to 0 . 您不处理nPercent评估为0

If you try to create a Bitmap with zero height and width, that is the exception you'll get. 如果尝试创建高度和宽度为零的Bitmap ,那将是一个例外。

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

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