2010-03-21 101 views
1

我在通過拖動鼠標調整圖像大小時遇到​​了一些問題。我找到了一個平均調整大小的方法,現在正在嘗試修改它以使用鼠標而不是給定的值。使用鼠標拖動調整圖像大小(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; 
    } 

回答

0

如果鼠標根本沒有移動,會發生什麼?您無法處理nPercent評估爲0的情況。

如果您嘗試創建零高度和寬度爲零的Bitmap,那麼您將會得到例外。

+0

謝謝,沒有想到這一點。我解決了這個問題,並且限制了圖片可以獲得的大小,所以類似的東西不會再發生。但現在我無法使調整大小的外觀變得平滑,並找到一種方法來修復多次重新調整後的失真... – Gaax

+1

@Gaax:每個調整大小都應該從原始圖像完成。只要你做了一份「副本」,你就開始逐漸退化。這裏不需要複雜的啓發式,只是始終使用原始數據源。 – Aaronaught

+0

我改變了我的代碼,所以我現在這樣做,它仍然在做同樣的事情,但它只需要更長的時間......這可能與我計算新的高度和寬度的方式有關嗎? – Gaax

1

爲了使失真最小化,您需要計算出圖像的實際尺寸與圖像的新尺寸之間的差異,並始終從原始圖像中創建重新尺寸的圖像。每當圖像大小發生變化時,請在要繪製圖像的控件上調用Refresh

順便說一下,PictureBox控件的SizeMode設置爲PictureBoxSizeMode.Zoom可以處理您的圖片大小調整。您重新調整大小的代碼只需要重新調整PictureBox的大小。 (當然,在你的情況下使用控件可能沒有意義,但我想我會讓你知道以防萬一)。

相關問題