Unity3D保存一张1080p(200W像素)以上的大图片 并打印

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。

代码如下:

 

  1. /// <summary>  
  2. /// 对相机截图。   
  3. /// </summary>  
  4. /// <returns>The screenshot2.</returns>  
  5. /// <param name="camera">Camera.要被截屏的相机</param>  
  6. /// <param name="rect">Rect.截屏的区域</param>  
  7. Texture2D CaptureCamera(Camera camera, Rect rect)   
  8. {  
  9.     // 创建一个RenderTexture对象  
  10.     RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);  
  11.     // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
  12.     camera.targetTexture = rt;  
  13.     camera.Render();  
  14.         //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。  
  15.         //ps: camera2.targetTexture = rt;  
  16.         //ps: camera2.Render();  
  17.         //ps: -------------------------------------------------------------------  
  18.   
  19.     // 激活这个rt, 并从中中读取像素。  
  20.     RenderTexture.active = rt;  
  21.     Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);  
  22.     screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素  
  23.     screenShot.Apply();  
  24.   
  25.     // 重置相关参数,以使用camera继续在屏幕上显示  
  26.     camera.targetTexture = null;  
  27.         //ps: camera2.targetTexture = null;  
  28.     RenderTexture.active = null// JC: added to avoid errors  
  29.     GameObject.Destroy(rt);  
  30.     // 最后将这些纹理数据,成一个png图片文件  
  31.     byte[] bytes = screenShot.EncodeToPNG();  
  32.     string filename = Application.dataPath + "/Screenshot.png";  
  33.     System.IO.File.WriteAllBytes(filename, bytes);  
  34.     Debug.Log(string.Format("截屏了一张照片: {0}", filename));  
  35.       
  36.     return screenShot;  
  37. }  

 

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);		
	}
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值