我在通過拖動鼠標調整圖像大小時遇到了一些問題。我找到了一個平均調整大小的方法,現在正在嘗試修改它以使用鼠標而不是給定的值。使用鼠標拖動調整圖像大小(C#)
我這樣做的方式對我有意義,但也許你們可以給我一些更好的想法。我基本上使用鼠標的當前位置和鼠標的前一個位置之間的距離作爲縮放因子。如果當前鼠標位置與圖像中心之間的距離小於之前鼠標位置與圖像中心之間的距離,則圖像變小,反之亦然。
隨着下面的代碼,我創建新的位圖與新的高度和寬度時,我得到一個參數異常(無效參數),我真的不明白爲什麼......任何想法?
---------------------------------編輯------------ ------------------------------------------
好的,多虧了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;
}
謝謝,沒有想到這一點。我解決了這個問題,並且限制了圖片可以獲得的大小,所以類似的東西不會再發生。但現在我無法使調整大小的外觀變得平滑,並找到一種方法來修復多次重新調整後的失真... – Gaax
@Gaax:每個調整大小都應該從原始圖像完成。只要你做了一份「副本」,你就開始逐漸退化。這裏不需要複雜的啓發式,只是始終使用原始數據源。 – Aaronaught
我改變了我的代碼,所以我現在這樣做,它仍然在做同樣的事情,但它只需要更長的時間......這可能與我計算新的高度和寬度的方式有關嗎? – Gaax