1. 程式人生 > >C#呼叫GDI+1.1中的函式實現高斯模糊、USM銳化等經典效果。

C#呼叫GDI+1.1中的函式實現高斯模糊、USM銳化等經典效果。

複製程式碼
 /// <summary>
        /// 對影象進行高斯模糊,參考:http://msdn.microsoft.com/en-us/library/ms534057(v=vs.85).aspx
        /// </summary>
        /// <param name="Rect">需要模糊的區域,會對該值進行邊界的修正並返回.</param>
        /// <param name="Radius">指定高斯卷積核的半徑,有效範圍[0,255],半徑越大,影象變得越模糊.</param>
        /// <param name="ExpandEdge">
指定是否對邊界進行擴充套件,設定為True,在邊緣處可獲得較為柔和的效果. </param> public static void GaussianBlur(this Bitmap Bmp, ref Rectangle Rect, float Radius = 10, bool ExpandEdge = false) { int Result; IntPtr BlurEffect; BlurParameters BlurPara; if
((Radius <0) || (Radius>255)) { throw new ArgumentOutOfRangeException("半徑必須在[0,255]範圍內"); } BlurPara.Radius = Radius ; BlurPara.ExpandEdges = ExpandEdge; Result = GdipCreateEffect(BlurEffectGuid, out BlurEffect);
if (Result == 0) { IntPtr Handle = Marshal.AllocHGlobal(Marshal.SizeOf(BlurPara)); Marshal.StructureToPtr(BlurPara, Handle, true); GdipSetEffectParameters(BlurEffect, Handle, (uint)Marshal.SizeOf(BlurPara)); GdipBitmapApplyEffect(Bmp.NativeHandle(), BlurEffect, ref Rect, false, IntPtr.Zero, 0); // 使用GdipBitmapCreateApplyEffect函式可以不改變原始的影象,而把模糊的結果寫入到一個新的影象中 GdipDeleteEffect(BlurEffect); Marshal.FreeHGlobal(Handle); } else { throw new ExternalException("不支援的GDI+版本,必須為GDI+1.1及以上版本,且作業系統要求為Win Vista及之後版本."); } }
複製程式碼