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

    xiaoxiao2021-04-17  43

    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);              }   }  
    转载请注明原文地址: https://ju.6miu.com/read-674138.html

    最新回复(0)