Android影像處理技術(實現Android中的PS)(六)

來源:互聯網
上載者:User

標籤:android   影像處理   技術   設計   效果   

好吧,關於Android中影像處理的最後一個微博,保證是最後一個了,希望泥萌不要罵我。。。

今天想實現的效果是:終極大招:利用BitmapMesh來實現一些特效。
當然,BitmapMesh功能十分強大,開啟大家的腦洞,相信大家會設計出更炫麗的特效:

和往常一樣,首先,上,賣個萌:

怎麼樣,普通的一張圖按正弦曲線跳起舞來了。。。

然後,開始吧:

首先,自訂View:BitmapMeshView:

public class BitmapMeshView extends View {    //後面跳舞的那張圖片    private Bitmap mBitmap;    //每個格子的寬度    private int WIDTH = 200;    //每個格子的高度    private int HEIGHT = 200;    //交點的總個數,比如說一個三行三列的表格,共有4*4=16個節點,不信自己數數看    private int COUNT = (WIDTH + 1) * (HEIGHT + 1);    //用來存放更改後的每個點的座標:說明一點,這裡我們用連續的兩個點表示一個座標:    //比如說verts[0]和verts[1]聯合表示第一個節點座標,verts[2]和verts[3]聯合表示第二個節點座標,以此類推    private float verts[] = new float[COUNT * 2];    private float origs[] = new float[COUNT * 2];    //更改前每個點的座標    private float k = 0;    //第幾個點    private int index=0;    //不說了。。    public BitmapMeshView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }    private void initView() {        //從資源中載入一張圖片        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);        //得到圖片的寬和高        float bmWidth = mBitmap.getWidth();        float bmHeight = mBitmap.getHeight();        //遍曆所有節點,記錄所有點的座標:        for (int i = 0; i < HEIGHT + 1; i++) {            //得到當前節點的Y軸座標:Y軸座標就是噹噹前行中所佔的比例,好好想想,不難            float fy = bmHeight * i / HEIGHT;            for (int j = 0; j < WIDTH + 1; j++) {                //得到當前節點的X軸座標:X軸座標就是噹噹前行中所佔的比例,                float fx=bmWidth*j/WIDTH;                //獲得原始座標,想想就知道了                origs[index*2+0]=verts[index*2+0]=fx;                //提一下:這裡fy+50是讓圖片往下平移一段距離,讓圖片在跳舞時不至於跳出螢幕外邊去                origs[index*2+1]=verts[index*2+1]=fy+50;                index++;            }        }    }    @Override    protected void onDraw(Canvas canvas) {        //這個雙層迴圈是從上面直接複製過來的,改一下中間的內容就行了        for (int i = 0; i < HEIGHT + 1; i++) {            for (int j = 0; j < WIDTH + 1; j++) {                //我們想實現的效果的本質是:x軸座標不動,y軸座標按正弦規律變化,所以我們只需要計算Y軸位移量                //下面這個位移量看似很複雜,其實很簡單:                /**                 * 解釋一下offset:  這其實是個標準的正弦運算式: Y=A*sin(w*x+&)+h;                 * 是不是很熟悉(有兩個符號不好打,直接用其他符號代替的,,,總之這不重要)                 * 我們來對號入座:                  * A=20                 * &=k;                 * h=0;                    * w=1/WIDTH*2*Math.PI                 * x=j                 * 然後想一下w為啥是1/WIDTH*2*Math.PI,這個不難吧                 */                float offSet=(float)Math.sin((float)j/WIDTH*2*Math.PI+k)*20;                //更改Y座標:在原來的基礎上加上一個offSet;                verts[(i*(WIDTH+1)+j)*2+1]=origs[(i*(WIDTH+1)+j)*2+1]+offSet;            }        }        //讓相位K遞增        k+=0.2F;        //繪圖        canvas.drawBitmapMesh(mBitmap, WIDTH, HEIGHT, verts, 0, null, 0, null);        //再次調用onDraw()方法,更新Y座標        invalidate();    }}

花了好長時間注釋,應該是講明白了,不明白的請留言,我會及時回複的。

當然,我們實現的效果知識一個小例子,希望本部落格能夠拋磚引玉,或者能給你些許啟發,相信加上你聰慧的大腦,肯定能編寫出更加絢麗的效果。

技術是死的,人是活的。。

好了,終於要結束了,希望能給各位朋友一些啟發,那我就非常高興了。

最後,Demo地址:http://download.csdn.net/detail/nsgsbs/8540553

Android影像處理技術(實現Android中的PS)(六)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.