2012-01-31 6 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

+0

@tkahnあなたは、安全でないことがASP.NETの文脈では問題であるかもしれません。これを回避するには、代わりにアルファチャンネルを転送するためにビットマップでGetPixel/SetPixelを使用することがありますが、それはずっと遅くなります。 –

関連する問題