yangxuteng 5 years ago
parent
commit
56a10063f7
2 changed files with 146 additions and 3 deletions
  1. 143 0
      G_Capture.cs
  2. 3 3
      README.md

+ 143 - 0
G_Capture.cs

@@ -0,0 +1,143 @@
+using UnityEngine;
+using System.Text;
+using System;
+using System.Collections;
+using System.IO;
+
+namespace G_Engine { 
+public class G_Capture : MonoBehaviour {
+
+        public static IEnumerator ScreenShoot(Rect rect)
+        {
+            //Wait for graphics to render
+            yield return new WaitForEndOfFrame();
+
+            //Create a texture to pass to encoding
+            Texture2D texture = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
+
+            //Put buffer into texture
+            texture.ReadPixels(rect, 0, 0);
+
+            //Split the process up--ReadPixels() and the GetPixels() call inside of the encoder are both pretty heavy
+            yield return 0;
+
+            byte[] bytes = texture.EncodeToPNG();
+
+            string imagePath = "";
+            switch (Application.platform)
+            {
+                case RuntimePlatform.WindowsEditor:
+                    imagePath = Application.dataPath + "/TAQRCode.png";
+                    break;
+                case RuntimePlatform.Android:
+                    imagePath = "/sdcard" + "/TAQRCode.png";
+                    break;
+                case RuntimePlatform.IPhonePlayer:
+                    imagePath = Application.dataPath + "/TAQRCode.png";
+                    break;
+            }
+
+            //Save our test image (could also upload to WWW)
+            File.WriteAllBytes(imagePath, bytes);
+
+            //Tell unity to delete the texture, by default it seems to keep hold of it and memory crashes will occur after too many screenshots.
+            DestroyObject(texture);
+
+            MSMgr.Instance().StartShareSDK(MSMgr.ShareType.TravelAlbum, imagePath);
+        }
+
+        private IEnumerator ScreenShoot(string filePath)
+        {
+            //Wait for graphics to render
+            yield return new WaitForEndOfFrame();
+
+            RenderTexture rt = new RenderTexture(Screen.width, Screen.height, 24);
+            Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
+
+            //Render from all!
+            foreach (Camera cam in Camera.allCameras)
+            {
+                cam.targetTexture = rt;
+                cam.Render();
+                cam.targetTexture = null;
+            }
+
+            RenderTexture.active = rt;
+            screenShot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
+            Camera.main.targetTexture = null;
+
+            //Added to avoid errors
+            RenderTexture.active = null;
+            Destroy(rt);
+
+            //Split the process up--ReadPixels() and the GetPixels() call inside of the encoder are both pretty heavy
+            yield return 0;
+
+            byte[] bytes = screenShot.EncodeToPNG();
+            File.WriteAllBytes(filePath, bytes);
+        }
+
+
+        /// <summary>  
+        /// Captures the screenshot2.  
+        /// </summary>  
+        /// <returns>The screenshot2.</returns>  
+        /// <param name="rect">Rect.截图的区域,左下角为o点</param>  
+        public static Texture2D CaptureScreenshot(Rect rect)
+        {
+            // 先创建一个的空纹理,大小可根据实现需要来设置  
+            Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
+
+            // 读取屏幕像素信息并存储为纹理数据,  
+            screenShot.ReadPixels(rect, 0, 0);
+            screenShot.Apply();
+
+            // 然后将这些纹理数据,成一个png图片文件  
+            byte[] bytes = screenShot.EncodeToPNG();
+            string filename = Application.dataPath + "/TAQRCode.png";
+            System.IO.File.WriteAllBytes(filename, bytes);
+            Debug.Log(string.Format("截屏了一张图片: {0}", filename));
+
+            // 最后,我返回这个Texture2d对象,这样我们直接,所这个截图图示在游戏中,当然这个根据自己的需求的。  
+            return screenShot;
+        }
+
+        /// <summary>  
+        /// 对相机截图。   
+        /// </summary>  
+        /// <returns>The screenshot2.</returns>  
+        /// <param name="camera">Camera.要被截屏的相机</param>  
+        /// <param name="rect">Rect.截屏的区域</param>  
+        public static 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;
+        }
+    }
+}

+ 3 - 3
README.md

@@ -1,4 +1,4 @@
 DemoSV
-======
-
-my demo SV
+
+
+ÕâÊÇÎҵĸöÈË´úÂë