2012-01-24 62 views
0

我有一個函數:到邊框飛度形象,用黑色填充,其餘在C#

private static Image ScaleAndPadBlack(Image original_img, Thumbnail thumb) 
    { 
     if (thumb.OptimalSizeHeight <= 0) 
     { 
      throw new ArgumentOutOfRangeException("OptimalSizeHeight", "OptimalSizeHeight must be declared and positive when using the ScaleAndCrop method."); 
     } 
     if (thumb.OptimalSizeWidth <= 0) 
     { 
      throw new ArgumentOutOfRangeException("OptimalSizeWidth", "OptimalSizeWidth must be declared and positive when using the ScaleAndCrop method."); 
     } 

     Size dest_size = new Size(thumb.OptimalSizeWidth, thumb.OptimalSizeHeight); 

     decimal act_width_rate = (decimal)dest_size.Width/(decimal)original_img.Width; 
     decimal act_height_rate = (decimal)dest_size.Height/(decimal)original_img.Height; 

     decimal scale_rate; 
     if (act_width_rate <= act_height_rate) 
      scale_rate = act_width_rate; 
     else 
      scale_rate = act_height_rate; 

     Size act_size = new Size(Convert.ToInt32(original_img.Width * scale_rate), Convert.ToInt32(original_img.Height * scale_rate)); 

     var res = resizeImage(original_img, act_size); 

     var b = new Bitmap(thumb.OptimalSizeWidth, thumb.OptimalSizeHeight); 
     var g = Graphics.FromImage(b); 

     Point p = new Point(((dest_size.Width - act_size.Width)/2), ((dest_size.Height - act_size.Height)/2)); 
     g.FillRectangle(Brushes.Black, new Rectangle(new Point(0, 0), dest_size)); 
     g.SmoothingMode = SmoothingMode.None; 
     g.InterpolationMode = InterpolationMode.NearestNeighbor; 
     g.DrawImage(res, p); 
     res.Dispose(); 
     res = null; 
     return b; 
    } 

這樣做是它調整圖像大小以適應邊框內,創建一個新的形象,填補它帶有黑色,並將調整後的圖像放在黑色圖像上。

的問題是,調整全白JPG(761x896)圖像爲270x180邊框的結果是:

Greyish bar on top

你可以看到,有在圖像的頂部的灰色條這是因爲調整大小的圖像以某種方式具有透明邊緣。

這是怎麼發生的?調整圖像大小可能導致透明邊緣?在這種情況下,這絕對不是理想的。

或者是因爲某些其他原因而出現頂部邊緣?

我應該如何編寫這樣的函數,在這種情況下沒有黑灰色邊緣?我只想填充沒有圖像的部分,我應該做一些完全不同的事情嗎?

編輯:

的g.SmoothingMode = SmoothingMode.None; g.InterpolationMode = InterpolationMode.NearestNeighbor;在那裏,因爲我正在測試這個問題。他們似乎並不重要。

+0

你確定這是一個透明的邊緣嗎? – annonymously

+0

您可以看到生成的圖片。我不確定。我在等待解釋。 – SoonDead

回答

0

我已經改變了的drawImage和fillrectangle部分:

 g.DrawImage(res, p);    
     //left 
     g.FillRectangle(Brushes.Black, new Rectangle(0, 0, p.X, dest_size.Height)); 
     //right 
     g.FillRectangle(Brushes.Black, new Rectangle(p.X + act_size.Width, 0, p.X, dest_size.Height)); 
     //up 
     g.FillRectangle(Brushes.Black, new Rectangle(0, 0, dest_size.Width, p.Y)); 
     //down 
     g.FillRectangle(Brushes.Black, new Rectangle(0, p.Y + act_size.Width, dest_size.Width, p.Y)); 

,它似乎與我的測試情況下工作。不過,我不確定是什麼導致了原始問題。