2012-01-31 72 views
1

我正在使用ASP.NET/C#/ GDI +進行一些圖像轉換。我有一個看起來像這樣的方法,使圓矩形圖像:在ASP.NET/C#中使用GDI +剪切圖像時的抗鋸齒功能?

public static Image MakeRound(Image img) 
{ 
    Bitmap bmp = new Bitmap(img.Width, img.Height); 

    GraphicsPath gp = new GraphicsPath(); 
    Graphics gr = Graphics.FromImage(bmp); 

    using (gp) 
    { 
     gp.AddEllipse(0, 0, img.Width, img.Height); 
     using (gr) 
     { 
      gr.SetClip(gp); 
      gr.DrawImage(img, Point.Empty); 
     } 
    } 
    return bmp; 
} 

它需要一個正方形圖像,然後一個橢圓添加是一樣大的圖像。然後,我使用SetClip刪除位於路徑之外的所有內容並返回一個圓形圖像。這按預期工作。

然後將返回的圖像繪製到另一個(較大)圖像的某個位置,並將生成的合成圖像保存爲文件。一個真實世界的例子是如何使用這個可以添加一個標誌或水印到現有的圖像。這裏是一些代碼從這個操作:

// Get backdrop image from server 
string backdropPath = Server.MapPath("/img/backdrop.jpg"); 
System.Drawing.Image backdrop = Bitmap.FromFile(backdropPath); 

// Create a graphics object to work with 
Graphics gra = Graphics.FromImage(backdrop); 
gra.DrawImage(MakeRound(smallerImage), new Point(50,50)); 

// Save the new image 
backdrop.Save(saveFilePath); 

唯一的問題是,疊加/圓/返回的圖像的邊緣有點粗糙。我想讓它的邊緣更平滑,以便與疊加的較大背景圖像融合得更好。

是否有任何可以使用的抗鋸齒參數?你認爲這種平滑應該在上面的方法中完成還是應用在圓形圖像疊加在更大的背景上時?

所有的指針和技巧是最受歡迎的!

回答

1

您正在尋找的技術稱爲羽化,即:羽化邊緣是在繪製圖像邊緣應用的抗鋸齒形式。

看看這篇文章soft edges in GDI+。它可能適用於您的場景。

+0

是的,我認爲這是沿着這些線我正在尋找。當我將DanByströms技術應用於我的解決方案時,我在疊加的圓形圖像上獲得了羽化邊緣。所以它的作品!我有點關心的唯一事情是這個解決方案中有一塊不安全的代碼(帶指針)。起初我遇到了一個錯誤,但我通過在web.config中添加了一個不安全的編譯器選項來解決這個問題。 – tkahn 2012-01-31 13:39:08

+0

@tkahn您可能會發現不安全是ASP.NET環境中的一個問題。解決方法是使用位圖上的GetPixel/SetPixel將alpha通道轉換爲整個通道,但速度會慢很多。 – 2012-01-31 14:16:56