【发布时间】:2010-03-21 02:25:36
【问题描述】:
我在仅通过拖动鼠标来调整图像大小时遇到了一些问题。我找到了一个平均调整大小的方法,现在正在尝试修改它以使用鼠标而不是给定值。
我这样做的方式对我来说很有意义,但也许你们可以给我一些更好的想法。我基本上使用鼠标当前位置和鼠标先前位置之间的距离作为缩放因子。如果当前鼠标位置到图像中心的距离小于之前鼠标位置到图像中心的距离,则图像变小,反之亦然。
使用下面的代码,我在创建具有新高度和宽度的新位图时遇到参数异常(无效参数),我真的不明白为什么......有什么想法吗?
---------------------------------编辑------------- ------------------------------------------
好的,感谢 Aaronaught,异常问题已得到修复,我更新了下面的代码。现在我遇到了一个问题,使调整大小看起来平滑,并找到一种方法来防止它扭曲到在多次调整大小后您无法识别图片的程度。
我防止它变形的想法是,当它在一定的尺寸范围内时,将它改回原始图像;但我不太确定如何在不让它看起来很奇怪的情况下完成这项工作。这是更新的代码:
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;
}
【问题讨论】: