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处理,即图片不放大也不缩小。
<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
1.进程启动
System.Diagnostics.Process process = new System.Diagnostics.Process(); //系统进程
process.StartInfo.CreateNoWindow = true; //不显示调用程序窗口
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;//
process.StartInfo.UseShellExecute = true; //采用操作系统自动识别模式
//Debug.Log(path);
process.StartInfo.FileName=path; //要打印的文件路径
process.StartInfo.Verb="print"; //指定执行的动作,打印:print 打开:open …………
process.Start();
2.打印API
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);
}
}