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);
}
///
/// Captures the screenshot2.
///
/// The screenshot2.
/// Rect.截图的区域,左下角为o点
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;
}
///
/// 对相机截图。
///
/// The screenshot2.
/// Camera.要被截屏的相机
/// Rect.截屏的区域
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;
}
}
}