(先解釋ReadPixels的參數,再來就是範例)

 

 

這個方法是讀取並儲存當前畫面的影像到Texture2D物件內,所以可以用來執行截圖的動作。

 

若要使用這個方法,一定要先建立Texture2D的物件,這裡介紹Texture2D最常用到的建構子。

public Texture2D(int width, int height);

int width:圖片的寬度。

int height:圖片的高度。

 

ReadPixels方法(Method)共有兩種多載(Overloading),皆可用來將當前畫面的紋理(Texture)儲存到Texture2D物件內。

ReadPixels(Rect source, int destX, int destY);

ReadPixels(Rect source, int destX, int destY, bool recalculateMipMaps);

 

說到這裡,先提一下Rect最常用的建構子,可以用來建立矩形

public Rect(float left, float top, float width, float height);

float left:距離畫面左邊的距離。

float top:距離畫面上面的距離。

float width:矩形的寬度(和上面那張圖片的width意思相同)。

float height:矩形的高度(和上面那張圖片的height意思相同)。

 

先介紹第一個截圖參數:

ReadPixels(Rect source, int destX, int destY);

Rect source:要截取的圖片在螢幕的位置,預設是以螢幕的左下角為基準點(0,0)開始,往右上角讀取。

int destX:將圖片向X軸移動到指定的距離(對基準點)。

int destY:將圖片向Y軸移動到指定的距離(對基準點)。

 

再來是第二個截圖參數:

ReadPixels(Rect source, int destX, int destY, bool recalculateMipMaps);

Rect source:同第一個參數的Rect source

int destX:同第一個參數的int destX

int destY:同第一個參數的int destY

bool recalculateMipMaps:是否重新計算紋理?預設值為true(也就是使用第一個截圖參數時,預設就為ture),若設置為false,則必須使用Apply()來重新計算。

 

 

 

(範例──在這裡我將這張圖片作為截圖範例使用↓)

 

 

 

先調整t2D的寬和高以及ReadPixels的Rect source參數!

先看看這個範例程式碼(範例一)

 


Texture2D t2D = new Texture2D(Screen.width, Screen.height);
t2D.ReadPixels(new Rect(0, 0, Screen.width, Screenw.height), 0, 0, false);
t2D.Apply();//若第二行的最後一個參數為true,則這行可省略。不過個人習慣將第二行最後一個參數設為false


t2D為整個螢幕畫面,截取的範圍同樣為整個螢幕畫面。

截取到的圖片為↓

完整的將該圖片全部截取了!

 

 

若是將程式改為這樣呢?(範例二)


Texture2D t2D = new Texture2D(Screen.width / 2, Screen.height / 2);
t2D.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
t2D.Apply();//若第二行的最後一個參數為true,則這行可省略。不過個人習慣將第二行最後一個參數設為false


t2D的寬和高剩下原來的一半了,但Rect的範圍沒變

結果如下↓

由於是從螢幕左下角開始截取,雖然讀取了整個螢幕,但是只有左下角能夠存入t2D內(寬和高各少了一半,也就是剩下原圖的四分之一),剩下的部分都超出了範圍。

 

 

那改成這樣呢?(範例三)


Texture2D t2D = new Texture2D(Screen.width, Screen.height);
t2D.ReadPixels(new Rect(0, 0, Screen.width / 2, Screen.height / 2), 0, 0, false);
t2D.Apply();//若第二行的最後一個參數為true,則這行可省略。不過個人習慣將第二行最後一個參數設為false


 只有Rect的寬和高各為原本的二分之一,t2D的大小沒變。

結果如下↓

由於圖片範圍為整個螢幕,但讀取的範圍只有螢幕的四分之一,且又是從左下角開始讀取,沒有讀取到的部分被填入了預設的灰色,所以造成了這個結果。

 

 

那改為這樣呢?(範例四)


Texture2D t2D = new Texture2D(Screen.width / 2, Screen.height / 2);
t2D.ReadPixels(new Rect(0, 0, Screen.width / 2, Screen.height / 2), 0, 0, false);
t2D.Apply();//若第二行的最後一個參數為true,則這行可省略。不過個人習慣將第二行最後一個參數設為false


t2D寬和高只剩下原本的一半,且Rect的範圍也是,那想想看會造成怎麼樣的結果呢?

......

......

答案是:

範例二相同的圖片!至於原因應該清楚了吧?

 

 

再來就是調整Rect的float left和float top了!

在這個範例程式碼中,我將left設定為100,top設定為50,t2D和Rect的寬高都為原本的二分之一,看看結果如何~~(範例五)


Texture2D t2D = new Texture2D(Screen.width / 2, Screen.height / 2);
t2D.ReadPixels(new Rect(100, 50, Screen.width / 2, Screen.height / 2), 0, 0, false);
t2D.Apply();//若第二行的最後一個參數為true,則這行可省略。不過個人習慣將第二行最後一個參數設為false


 

結果如下↓

 

為什麼會是在這個奇妙的地方呢?讓我們來看看圖解~~

程式先進行了將基準點從(0,0)向X軸移動了100(咖啡色線),及向Y軸移動了50(咖啡色線)。寬度為螢幕的一半(黑色線),高度也為螢幕的一半(黑色線),所以截取到了這個範圍內的圖(使用小畫家製作的圖片,所以畫的不是很準)。

 

 

那接下來修改destX和destY的參數了!為了方便說明,所以將t2D的寬高及截取的範圍寬高都設定為原本的二分之一,其餘不變。

先看看程式碼~~(範例六)


Texture2D t2D = new Texture2D(Screen.width / 2, Screen.height / 2);
t2D.ReadPixels(new Rect(0, 0, Screen.width / 2, Screen.height / 2), 50, 10, false);
t2D.Apply();//若第二行的最後一個參數為true,則這行可省略。不過個人習慣將第二行最後一個參數設為false


destX設為50,destY設為10。

結果如下↓

恩...?

灰色又出來了,是怎麼回事?

原因是因為先將圖片向X軸移動了50,向Y軸移動了10之後(和範例五類似,但一個是移動基準點,一個是移動圖片),再從基準點開始截取圖片。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Yang 的頭像
    Yang

    Yang的部落格(轉貼文章請註記來源)

    Yang 發表在 痞客邦 留言(1) 人氣()