(先解釋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之後(和範例五類似,但一個是移動基準點,一個是移動圖片),再從基準點開始截取圖片。
留言列表