Unity两种保存大图的方法:
1、使用Application类下的CaptureScreenshot方法:截屏
基本语法:
(1) public static void CaptureScreenshot(string filename);
(2) public static void CaptureScreenshot(string filename, int superSize);
其中参数filename为截屏文件名称,superSize为放大系数,默认为0,即不放大。
功能说明此方法用于截取当前游戏画面并将截取的图片保存为PNG格式。截屏后文件会默认保存在根目录下,如果根目录下已存在同名文件,将会被替换。当superSize大于1时,截屏文件的宽度和高度将同时被放大superSize倍。
此方法在Web模式下无效。
当放大系数小于0时,按默认值0处理,即图片不放大也不缩小。
[csharp] view plain copy <pre name="code" class="csharp">void OnGUI(){ if (GUI.Button (new Rect (5, 5, 120, 30), "CaptureScreen1")) Application.CaptureScreenshot("Screenshot1.png", 1);//屏幕像素大小的图片 if (GUI.Button (new Rect (5, 40, 120, 30), "CaptureScreen2")) Application.CaptureScreenshot("Screenshot2.png", 2);//屏幕2倍大 if (GUI.Button (new Rect (5, 180, 120, 30), "CaptureScreen10")) Application.CaptureScreenshot("Screenshot10.png", 10);//屏幕3倍大 }
这个方法,截取的是某一帧时整个游戏的画面,或者说是全屏截图吧。
a、不能针对某一个相机(camera)的画面,进行截图。
b、对局部画面截图,实现起来不方便,效率也低,不建议在项目中使用。
2、针对某个相机进行截图。
在游戏中场景中所看的画面了,UI界面(用一个专门的camera显示)什么的是不应该有的。要做到这一点,我们应该将分出一个camera来专门显示ui界面,用另一个camera相机来场景显示场景画面。然后,我们只对场景相机进行截屏就是了。所以这关键点就是:如何实现对某个相机进行截屏了。这里用到一个新的类是RenderTexture。
步骤:
先创建一个UI Canvas,Canvas的Render Mode设置为Screen Space - Camera,并把一个新建的Camera拉进Render Camera。
代码如下:
/// <summary> /// 对相机截图。 /// </summary> /// <returns>The screenshot2.</returns> /// <param name="camera">Camera.要被截屏的相机</param> /// <param name="rect">Rect.截屏的区域</param> Texture2D CaptureCamera(Camera camera, Rect rect) { // 创建一个RenderTexture对象 RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0); // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机 camera.targetTexture = rt; camera.Render(); //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。 //ps: camera2.targetTexture = rt; //ps: camera2.Render(); //ps: ------------------------------------------------------------------- // 激活这个rt, 并从中中读取像素。 RenderTexture.active = rt; Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false); screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素 screenShot.Apply(); // 重置相关参数,以使用camera继续在屏幕上显示 camera.targetTexture = null; //ps: camera2.targetTexture = null; RenderTexture.active = null; // JC: added to avoid errors GameObject.Destroy(rt); // 最后将这些纹理数据,成一个png图片文件 byte[] bytes = screenShot.EncodeToPNG(); string filename = Application.dataPath + "/Screenshot.png"; System.IO.File.WriteAllBytes(filename, bytes); Debug.Log(string.Format("截屏了一张照片: {0}", filename)); return screenShot; }
2.打印API [csharp] view plain copy public class ex: MonoBehaviour { private System.Drawing.Printing.PrintDocument printDocument1; void Start () { this.printDocument1 = new System.Drawing.Printing.PrintDocument(); this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage); //this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage); } void OnGUI(){ if(GUI.Button(new Rect(5,5,80,50),"print")) printDocument1.Print(); } private void printDocument1_PrintPage(object sender,System.Drawing.Printing.PrintPageEventArgs e) { Bitmap bitmap = new Bitmap("image.jpg");//根目录 e.Graphics.DrawImage(bitmap, 150, 240, 500, 700); } }