大家首先要去Unity官网下载UniRx插件,,,这个插件是做什么用的呢,,,这里咱们简单说一下:通常,unity的网络操作需要使用到WWW和协程(Coroutine),但是,使用协程(Coroutine)对于异步操作而言不是一个好的办法,原因如下:
1、协程不能返回任何值,因为它的返回类型必须是IEnumerator。
2、协程不能够捕捉异常,因为yield return 声明不支持try-catch结构。、
这时咱们UniRx插件的强大之处就显示出来了:UniRx 集成了协程并可观测,你能在协程里写异步代码,并使用UniRx编排,这是控制异步流的最佳办法。   更多的好处和用处,,,咱们就不在这里一一叙述了,,,感兴趣的话大家可以自行百度。。。

下面咱们来实现截屏功能。。。。截屏后的图片咱们以当前截取的时间来命名
  1. Texture2D CaptureCamera(Camera camera, Rect rect)
  2.     {
  3.         // 建一个RenderTexture对象  
  4.         RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 1);
  5.         // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
  6.         camera.targetTexture = rt;
  7.         camera.Render();

  8.         // 激活这个rt, 并从中中读取像素。  
  9.         RenderTexture.active = rt;
  10.         Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
  11.         screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素  
  12.         screenShot.Apply();

  13.         // 重置相关参数,以使用camera继续在屏幕上显示  
  14.         camera.targetTexture = null;
  15.         //ps: camera2.targetTexture = null;  
  16.         RenderTexture.active = null; // JC: added to avoid errors  
  17.         GameObject.Destroy(rt);
  18.         // 最后将这些纹理数据,成一个png图片文件  
  19.         byte[] bytes = screenShot.EncodeToPNG();

  20.         // 获取系统时间
  21.         System.DateTime now = new System.DateTime();
  22.         now = System.DateTime.Now;
  23.         string picName = string.Format("image{0}{1}{2}{3}.png", now.Day, now.Hour, now.Minute, now.Second);
  24.         currentScreenCaptureName = picName;

  25.         string filename =

  26. #if UNITY_EDITOR || UNITY_STANDALONE
  27.             Application.streamingAssetsPath + "/" + picName;
  28. #elif UNITY_ANDROID
  29.                 "/sdcard/DCIM/Camera/"+picName;
  30. #endif
  31.         currentAlbumPath = filename;

  32.         System.IO.File.WriteAllBytes(filename, bytes);
  33.         Debug.Log(string.Format("截屏了一张照片: {0}", filename));

  34. #if UNITY_EDITOR
  35.         UnityEditor.AssetDatabase.Refresh();
  36. #endif

  37.         texture = screenShot;

  38.         return screenShot;
  39.     }
复制代码


截屏后的照片咱们用UniRx上传到服务器:
  1. public void OnCliclUpload()
  2.     {
  3.         //创建一个屏幕大小的纹理,RGB24格式
  4.         //int width = Screen.width;
  5.         //int height = Screen.height;
  6.         var tex = texture;   //texture为你在上面截屏后所得到的Texture

  7.         //将屏幕内容读入纹理
  8.         //tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
  9.         //tex.Apply();

  10.         //将纹理编码成PNG
  11.         byte[] bytes = tex.EncodeToPNG();
  12.         Destroy(tex);

  13.         Debug.Log("--------------------------------OnCliclUpload--------------------------");
  14.         WWWForm formEvent = new WWWForm();      //定义表头
  15.       
  16.         formEvent.AddField("imgName", currentScreenCaptureName); //添加和服务器约定好的格式
  17.         formEvent.AddField("access_token", GlobalConstData.userToken);
  18.         formEvent.AddBinaryData("img", bytes, currentScreenCaptureName, "image/png");

  19.         var parallel = Observable.WhenAll(
  20.                 ObservableWWW.Post("127.0.0.1", formEvent));

  21.         parallel.CatchIgnore((WWWErrorException ex) =>
  22.         {
  23.             Debug.Log("===error:" + ex.RawErrorMessage);

  24.         }).Subscribe(xs =>
  25.         {
  26.             Debug.Log("--------------Finished Uploading Screenshot----------------------"+ xs[0]);
  27.             // xs[0].Contains("content");
  28.             JosnMsg jm = JsonUtility.FromJson<JosnMsg>(xs[0]);
  29.             tempName = jm.content;
  30.         });
  31.     }
复制代码


这样上传功能就写好了。。。
     下面咱们用WWW的格式来进行图片下载。。。
  1. IEnumerator DownloadImage(string url, Image image)
  2.     {
  3.         string[] imgname = url.Split('/');
  4.         WWW www = new WWW(url);
  5.         yield return www;
  6.         if(www.isDone )
  7.         {
  8.             Texture2D tex2d = www.texture;
  9.             //将图片保存至缓存路径  
  10.             byte[] bytes = tex2d.EncodeToPNG();
  11.             System.IO.File.WriteAllBytes(path + "/"+ imgname[imgname.Length-1], bytes);
  12.            // DestroyImmediate(image.sprite.texture, false);
  13.             Sprite m_sprite = Sprite.Create(tex2d, new Rect(0, 0, tex2d.width, tex2d.height), new Vector2(0, 0));
  14.             image.sprite = m_sprite;
  15.         }
  16. www.Dispose();
  17.     }
复制代码
文章来自:http://www.taidous.com/thread-55825-1-1.html
无欲无求
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ| Archiver|手机版|小黑屋| 亮社区   

Copyright © 2001-2013 Comsenz Inc.   All Rights Reserved.

Powered by Discuz! X3.2( 京ICP备16064692号-2 )

快速
回复
返回
列表
返回
顶部
加入R社联盟,立即注册账号登陆 QQ账号登陆 微信账号登陆