圖像濾鏡藝術---擠壓(Pinch)濾鏡

Pinch濾鏡
Pinch濾鏡是通過坐標變換來實現以某個點(cenX,cenY)爲中心,某個半徑R內圖像向其擠壓變形的效果。實現這個濾鏡的算法很多,主要是數學公式的不同,大家可以自行設計,這裏給個代碼示例,大家可以直接使用。
代碼如下:
//
        /// <summary>
        /// Pinch Filter
        /// </summary>
        /// <param name="src">Source image.</param>
        /// <param name="cenX">The X position of sun.</param>
        /// <param name="cenY">The Y position of sun.</param>
        /// <returns>The result image.</returns>
        private Bitmap PinchFilterProcess(Bitmap srcBitmap, int cenX, int cenY)
        {
            Bitmap a = new Bitmap(srcBitmap);
            int w = a.Width;
            int h = a.Height;
            int radius = 0;
            Bitmap dst = new Bitmap(w, h);
            System.Drawing.Imaging.BitmapData srcData = a.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            System.Drawing.Imaging.BitmapData dstData = dst.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            unsafe
            {
                byte* pIn = (byte*)srcData.Scan0.ToPointer();
                byte* pOut = (byte*)dstData.Scan0.ToPointer();
                byte* p = null;
                int sWidth = srcData.Stride;
                int stride = sWidth - w * 4;
                int offsetX = 0, offsetY = 0;
                int newX = 0, newY = 0;
                double radian = 0,degree = 10;
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        offsetX = x - cenX;
                        offsetY = y - cenY;
                        radian = Math.Atan2(offsetY, offsetX);
                        radius = (int)(Math.Sqrt(offsetX * offsetX + offsetY * offsetY));
                        radius = (int)(Math.Sqrt(radius) * degree);
                        newX = (int)(radius * Math.Cos(radian)) + cenX;
                        newY = (int)(radius * Math.Sin(radian)) + cenY;
                        newX = Math.Min(w - 1, Math.Max(0, newX));
                        newY = Math.Min(h - 1, Math.Max(0, newY));
                        p = pIn + newY * srcData.Stride + newX * 4;
                        pOut[0] = (byte)p[0];
                        pOut[1] = (byte)p[1];
                        pOut[2] = (byte)p[2];
                        pOut[3] = (byte)255;                     
                        pOut += 4;
                    }
                    pOut += stride;
                }
                a.UnlockBits(srcData);
                dst.UnlockBits(dstData);
            }
            return dst;

        }
效果圖如下:

圖像濾鏡藝術---擠壓(Pinch)濾鏡

原圖

圖像濾鏡藝術---擠壓(Pinch)濾鏡

Pinch濾鏡效果圖

最後放上一個完整的C#版程序Demo給大家下載使用:http://www.zealpixel.com/forum.php?mod=viewthread&tid=55&extra=page%3D1

更多相關文章
  • 圖像濾鏡藝術---(Sketch Filter)素描濾鏡
    (Sketch Filter)素描濾鏡 素描濾鏡的實現方法比較簡單,這裏我們直接寫出算法過程如下: 1, 原圖 素描濾鏡效果圖 最後放上完整C#/C程序DEMO下載連接:http://www.zealpixel.com/thread-64-1-1.html
  • 圖像濾鏡藝術---旋轉模糊濾鏡
    本文介紹一種旋轉模糊濾鏡的實現算法. 旋轉模糊主要特點是:整張圖像圍繞一個中心點做旋轉變換,同時有個控制旋轉程度的變量和一個控制模糊程度的變量,來完成這個效果.圖像中距離中心點越近,旋轉和模糊的程度都越小,反之,越大.假設中心點O坐標爲(cenX,cenY),當前點位置爲P(x,y):1,PO距離D ...
  • 圖像濾鏡藝術---Oilpaint油畫濾鏡
     Oilpaint油畫濾鏡    圖像油畫效果實際上是將圖像邊緣産生一種朦胧,霧化的效果,同時,將一定的邊緣模糊化,這樣圖像整體上看去像素與像素之間就像霧一樣隨機呈現. 算法過程如下: 假設當前像素爲P(x,y),他的隨機位置爲Pd(dx,dy),那麽算法公式如下: 其中,K(v)爲最大值不大于v的 ...
  • 圖像濾鏡藝術---圖像濾鏡暈影調節算法研究
    本文對濾鏡中常見的暈影,暈角效果的實現做了研究,具體如下:1 暈影調整算法所謂暈影就是給圖像四個角添加暗影效果,這暗影向圖像中心逐漸淡化.我們使用如下公式來實現:假設圖像寬度高度分別爲w,h:double d = Math.Sqrt((i - w / 2) * (i - w / 2) + (j -  ...
  • 圖像濾鏡藝術---霓虹、浮雕、木刻濾鏡
     圖像特效往往可以將普通的照片呈現出一種令人耳目一新的效果,特效的種類繁多,比如各種流行的 濾鏡特效等等,今天,我們介紹幾種最簡單的濾鏡:霓虹效果,浮雕效果和木刻效果.     1,霓虹濾鏡     霓虹是用來描繪圖像的輪廓,勾畫出顔色變化的邊緣,加強其過度效果,使圖像産生輪廓發光的效果.主要原理是 ...
  • 圖像濾鏡藝術---球面(Spherize)濾鏡
    球面(Spherize)濾鏡 球面濾鏡是通過極坐標變換實現圖像的球面特效. 代碼如下:         //        ///         /// Pinch Filter        ///        /// Source image.        /// The X positi ...
  • 圖像濾鏡藝術---Wave濾鏡
    Wave Filter水波濾鏡 水波濾鏡是通過坐標變換來模擬水波效果,使圖像呈現出水波的特效.這個濾鏡有一個可調參數:水波的扭曲程度. 代碼如下;//        ///        /// Wave Filter        ///        /// Source image.      ...
  • 圖像濾鏡藝術---Swirl濾鏡
    Swirl Filter Swirl 濾鏡是實現圖像圍繞中心點(cenX,cenY)扭曲旋轉的效果,效果圖如下: 原圖 效果圖 代碼如下:         //         ///         /// Swirl Filter         ///         /// Source i ...
一周排行
  •          Lua中的函數還可以接受不同數量的實參.例如:在調用print時可以傳入一個.兩個或多個實參.function add(...) local s = 0   for i, v in ipairs{. ...
  • 功能說明:檢查文件系統並嘗試修複錯誤. 語法:     fsck [-aANPrRsTV][-t <文件系統類型>][文件系統...] 補充說明:當文件系統發生錯誤四化,可用fsck指令嘗試加以修複. 參 ...
  • 版本控制一    安裝,配置SVN
    svn的好處和它的功能我就不再羅嗦的說了:下面,我們動手來做一個測試就明白其操作:①到sv ...
  • Java中二進制數使用補碼的方式表示. (1)正數的最高位爲0,其余各位代表數值本身(二進制數). (2)對于負數,通過對該數絕對值的補碼按位取反,再對整個數加1.  左移運算    <<    例如:3 ...
  • 老牌報表控件FastReport.Net更新至v2014.2,提升數據庫訪問速度,修複SVG導出中的字體等問題,下面是新版本的一些信息.新增功能:添加連接器Google BigQuery \Extras\Connec ...
  • 允許轉載,但請注明出處根據前面的文章已經知道haoop自帶有http://xxx/jmx的數據返回接口,並且返回的是json對象.用python編寫了一個采集數據的腳本到mysql庫中,繪圖部分還未編寫,慢慢我會加上 ...
  •   日前聽鄭國江的講座,鄭Sir
  •    一些研究者(Hayes.Bloom)的研究表明,在許多領域,都需要大約10 年時間才能培養出專業技能,包括國際象棋.作曲.繪畫.鋼琴.遊泳.網球,以及神經心理學和拓撲學的研究.似乎並不存在真正的捷徑:即使是莫紮 ...
  • 臨時使用loadrunner測試在新的環境下壓力,安裝rpc.rstatd1.下載 rstatd  http://sourceforge.net/projects/rstatd2.安裝      #tar xvzf ...
  • 在mysql 中默認安裝的字符集是liant1,爲了方便現在決定將默認的字符集改成uft8.解決方案:1.找到並編輯文件my.cnf,   它位于 /etc/mysql/ 下面.     sudo gedit /et ...