using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using System.IO; using Module.Log; public enum IMAGE_CHECK_STATE { NONE = 0, PASS = 1, CHECKING = 2, BACK = 3, } [RequireComponent(typeof(Image))] public class NetImage : MonoBehaviour { public Image _Image; public Image _ImageChecking; void Awake() { _Image = GetComponent(); //InitImageUrl(); SetUsingImage(this); } private void OnDestroy() { RemoveUsingImage(this); } #region image catch private static Dictionary _CatchImages; private static Dictionary> _LoadingImgCallBack = new Dictionary>(); private static string _FoldPath; private static string _FilePath; protected delegate void GetImageCallBack(Texture2D texture, IMAGE_CHECK_STATE imgState); protected static void LoadTexture(string url, GetImageCallBack imgCallback, ulong playerGuid, bool isHeadPic) { if (_CatchImages == null) { InitImagePath(); } Debug.Log("LoadTexture:" + url); if (!_LoadingImgCallBack.ContainsKey(url)) { _LoadingImgCallBack.Add(url, new List()); _LoadingImgCallBack[url].Add(imgCallback); GameManager.gameManager.StartCoroutine(LoadImage(url, playerGuid, isHeadPic)); } else { _LoadingImgCallBack[url].Add(imgCallback); } } private static IEnumerator LoadImage(string url, ulong playerGuid, bool isHeadPic) { string imgUrl = url; WWW w = null; //imgUrl = "http://serv.zhanyou-game.com:8098/api/Image/get"; imgUrl = isHeadPic ? Community.Instance.HeadPicDownUrl : Community.Instance.BlogPicDownUrl; WWWForm form = new WWWForm(); string timeStamp = GCGame.Utils.GetTimeStamp(); string randomStr = GCGame.Utils.GetRandomStr(); string sign = GCGame.Utils.GetSignString(timeStamp, randomStr, Community.Instance._ApiKey); form.AddField("timestamp", timeStamp); form.AddField("nonce_str", randomStr); form.AddField("sign", sign); if (isHeadPic) { form.AddField("type", "head_image"); } else { form.AddField("type", "weibo_image"); } form.AddField("guid", playerGuid.ToString()); form.AddField("image", url); // Upload to a cgi script w = new WWW(imgUrl, form); yield return w; if (!string.IsNullOrEmpty(w.error)) { //GuiTextDebug.debug("img url error:" + w.error); LogModule.ErrorLog("load image error:" + w.error + ", " + imgUrl); GUIData.AddNotifyData(w.error); _LoadingImgCallBack.Remove(url); yield break; } else { Texture2D texture = null; //如果有本地缓存,显示本地缓存 if (_CatchImages.ContainsKey(url)) { imgUrl = GetPlatFromPath(_CatchImages[url]); GuiTextDebug.debug("img url local:" + imgUrl); WWW localWWW = new WWW(imgUrl); yield return localWWW; if (!string.IsNullOrEmpty(localWWW.error)) { //GuiTextDebug.debug("img url error:" + w.error); LogModule.ErrorLog("load image error:" + localWWW.error + ", " + imgUrl); GUIData.AddNotifyData("#{39031}"); _LoadingImgCallBack.Remove(url); yield break; } else { texture = localWWW.texture; } } var uploadRet = JsonUtility.FromJson(w.text); LogModule.DebugLog(w.text); IMAGE_CHECK_STATE imgState = IMAGE_CHECK_STATE.PASS; if (uploadRet.errno == 0) { if (uploadRet.data.Length > 0 && uploadRet.data[0].status == 1) { if (!_CatchImages.ContainsKey(url)) {//没有本地缓存,从服务器加载 string imgdownUrl = uploadRet.data[0].url; w = new WWW(imgdownUrl); yield return w; if (!string.IsNullOrEmpty(w.error)) { //GuiTextDebug.debug("img url error:" + w.error); LogModule.ErrorLog("load image error:" + w.error + ", " + imgUrl); GUIData.AddNotifyData("#{39031}"); } else { AddImagePath(url, w.texture); texture = w.texture; } } } else if (uploadRet.data[0].status == 2) { //审核没通过 imgState = IMAGE_CHECK_STATE.BACK; } else { //图片审核中 if (!_CatchImages.ContainsKey(url)) {//如果没有本地缓存显示提示1 imgState = IMAGE_CHECK_STATE.CHECKING; } else {//有本地缓存,显示提示2 imgState = IMAGE_CHECK_STATE.CHECKING; } } for (int i = 0; i < _LoadingImgCallBack[url].Count; ++i) { try { _LoadingImgCallBack[url][i](texture, imgState); } catch (System.Exception e) { } } } else { GUIData.AddNotifyData(uploadRet.msg); for (int i = 0; i < _LoadingImgCallBack[url].Count; ++i) { try { _LoadingImgCallBack[url][i](texture, IMAGE_CHECK_STATE.CHECKING); } catch (System.Exception e) { } } } _LoadingImgCallBack.Remove(url); } } private static void InitImagePath() { _CatchImages = new Dictionary(); _FoldPath = Application.persistentDataPath + "/ImagePath"; _FilePath = _FoldPath + "/ImagePath.txt"; GCGame.Utils.CheckTargetPath(_FilePath); if (!File.Exists(_FilePath)) { var file = File.Create(_FilePath); file.Close(); return; } StreamReader streamReader = new StreamReader(_FilePath); while (!streamReader.EndOfStream) { var pathLine = streamReader.ReadLine(); var pathSplit = pathLine.Split('\t'); if (pathSplit.Length > 1) { if (!_CatchImages.ContainsKey(pathSplit[0])) { _CatchImages.Add(pathSplit[0], pathSplit[1]); } } } streamReader.Close(); } private static void AddImagePath(string url, Texture2D texture) { if (_CatchImages == null) { InitImagePath(); } //var nameSplit = url.Split('='); //if (nameSplit.Length > 1) { string localPath = Application.persistentDataPath + "/ImagePath/" + url; if (File.Exists(localPath)) { if(_CatchImages.ContainsKey(url)) _CatchImages.Remove(url); File.Delete(localPath); } byte[] bytes = texture.EncodeToPNG(); File.WriteAllBytes(localPath, bytes); StreamWriter fileStream = File.AppendText(_FilePath); fileStream.WriteLine(url + "\t" + localPath); fileStream.Close(); _CatchImages.Add(url, localPath); } } private static string GetPlatFromPath(string path) { if (Application.isEditor) return "file:///" + path.Replace("\\", "/"); // Use the build output folder directly. else if (Application.platform == RuntimePlatform.IPhonePlayer) return "file://" + path; else if (Application.isMobilePlatform || Application.isConsolePlatform) return "file://" + path; else // For standalone player. return "file://" + path; } #endregion #region using image public static List _UsingImage = new List(); public static void SetUsingImage(NetImage netImage) { _UsingImage.Add(netImage); } public static void RemoveUsingImage(NetImage netImage) { _UsingImage.Remove(netImage); } public static void ChangeHeadPic(string url, Texture2D image, IMAGE_CHECK_STATE imgState) { for (int i = 0; i < _UsingImage.Count; ++i) { if (_UsingImage[i] == null) continue; if (_UsingImage[i].NetImageUrl != url) continue; _UsingImage[i].SetNetImage(image, imgState); } } #endregion #region protected string _NetImageUrl; public string NetImageUrl { get { return _NetImageUrl; } set { _NetImageUrl = value; } } protected Texture2D _NetTexture; public Texture2D NetTexture { get { return _NetTexture; } } public void ClearNetImage() { _ImageChecking.gameObject.SetActive(false); } public void SetNetImage(string netImageUrl, ulong playGuid, bool isHeadPic = true) { //_ImageChecking.gameObject.SetActive(false); //if (_NetImageUrl == netImageUrl && _Image.sprite != null) // return; _NetImageUrl = netImageUrl; //StartCoroutine(GetWWWImage()); _Image.sprite = null; _Image.enabled = false; Debug.Log("SetNetImage:" + netImageUrl); LoadTexture(netImageUrl, SetNetImage, playGuid, isHeadPic); } public virtual void SetNetImage(Texture2D texture2D, IMAGE_CHECK_STATE imgState) { if (_ImageChecking == null) { Debug.Log("_ImageChecking is null:" + gameObject.name); } _ImageChecking.gameObject.SetActive(false); if (texture2D != null) { _Image.enabled = true; _NetTexture = new Texture2D((int)_Image.rectTransform.rect.width, (int)_Image.rectTransform.rect.height); int minPos = 0; int maxPosX = texture2D.width - 1; int maxPos = texture2D.height - 1; float rateX = texture2D.width / _Image.rectTransform.rect.width; float rateY = texture2D.height / _Image.rectTransform.rect.height; for (int i = 0; i < _NetTexture.width; ++i) { for (int j = 0; j < _NetTexture.height; ++j) { int sampleX = Mathf.Clamp((int)(i * rateX), minPos, maxPosX); int sampleY = Mathf.Clamp((int)(j * rateY), minPos, maxPosX); _NetTexture.SetPixel(i, j, texture2D.GetPixel(sampleX, sampleY)); } } _NetTexture.Apply(); _Image.gameObject.SetActive(true); _Image.sprite = Sprite.Create(_NetTexture, new Rect(0, 0, _NetTexture.width, _NetTexture.height), new Vector2(0.5f, 0.5f)); if (imgState == IMAGE_CHECK_STATE.CHECKING) { _ImageChecking.gameObject.SetActive(true); LoadAssetBundle.Instance.SetImageSprite(_ImageChecking, "ImageChecking2"); //_Image.sprite = null; } else if (imgState == IMAGE_CHECK_STATE.BACK) { _ImageChecking.gameObject.SetActive(true); LoadAssetBundle.Instance.SetImageSprite(_ImageChecking, "ImageChecking3"); } } else { _Image.sprite = null; if (imgState == IMAGE_CHECK_STATE.CHECKING) { _ImageChecking.gameObject.SetActive(true); LoadAssetBundle.Instance.SetImageSprite(_ImageChecking, "ImageChecking1"); } else if (imgState == IMAGE_CHECK_STATE.BACK) { _ImageChecking.gameObject.SetActive(true); LoadAssetBundle.Instance.SetImageSprite(_ImageChecking, "ImageChecking3"); } } } public virtual void CleanUpImage() { _Image.gameObject.SetActive(false); _NetTexture = null; _NetImageUrl = ""; } public virtual void UploadImage(UploadCallBack upLoadSucess, UploadCallBack uploadFail) { _UploadSucess = upLoadSucess; _UploadFail = uploadFail; //UploadHeadPic(this); var timeMark = System.DateTime.Now - new System.DateTime(0); _NetImageUrl = "playerIcon" + CommunityLogic.CommunityPlayerInfo.GUID + (ulong)timeMark.TotalSeconds; //Community.Instance._HeadPicUpLoadUrl = _NetImageUrl; StartCoroutine(UploadImage(new List() { NetTexture }, true)); ChangeHeadPic(_NetImageUrl, NetTexture, IMAGE_CHECK_STATE.CHECKING); AddImagePath(_NetImageUrl, NetTexture); } #endregion #region //public static string _HeadIconUrl = "http://serv.zhanyou-game.com:8098/imgupload/FileUpLoad"; //public static string _ImageUpLoadUrl = "http://serv.zhanyou-game.com:8098/imgupload/FileUpLoad"; //public static string _ImageDownUrl = "http://serv.zhanyou-game.com:8098/imgupload/FileDown?img=20170815191800.png"; public delegate void UploadCallBack(List uploadFileName); protected static UploadCallBack _UploadSucess; protected static UploadCallBack _UploadFail; private static NetImage _UploadingImage; //private static void InitImageUrl() //{ // CG_REQ_MENGDAO_URL packet = (CG_REQ_MENGDAO_URL)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_MENGDAO_URL); // packet.Nilparam = 1; // packet.SendPacket(); //} //public static void InitImageUrlRet(GC_RET_MENGDAO_URL packet) //{ // _ImageUpLoadUrl = packet.Blogpiuploadcurl; // _ImageDownUrl = packet.Blogpicdownurl; //} private static void UploadHeadPic(NetImage uploadImage) { _UploadingImage = uploadImage; CG_REQ_HEAD_PIC_FILE_NAME packet = (CG_REQ_HEAD_PIC_FILE_NAME)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_HEAD_PIC_FILE_NAME); packet.Nilparam = 1; packet.SendPacket(); } public static void RetHeadPicName(GC_RET_HEAD_PIC_FILE_NAME packet) { if (_UploadingImage == null) return; if (string.IsNullOrEmpty(packet.Headpicname)) return; _UploadingImage.NetImageUrl = packet.Headpicname; _UploadingImage.StartCoroutine(UploadImage(new List() { _UploadingImage.NetTexture }, true)); ChangeHeadPic(_UploadingImage._NetImageUrl, _UploadingImage.NetTexture, IMAGE_CHECK_STATE.CHECKING); } protected static IEnumerator UploadImage(List uploadImages, bool isHeadPic) { string url = isHeadPic? Community.Instance.HeadPicUpLoadUrl: Community.Instance.BlogPicUpLoadUrl; WWWForm form = new WWWForm(); //form.AddBinaryData("FileUpLoad", bytes, fileName, "image/png"); string timeStamp = GCGame.Utils.GetTimeStamp(); string randomStr = GCGame.Utils.GetRandomStr(); string sign = GCGame.Utils.GetSignString(timeStamp, randomStr, Community.Instance._ApiKey); form.AddField("timestamp", timeStamp); form.AddField("nonce_str", randomStr); form.AddField("sign", sign); if (isHeadPic) { form.AddField("type", "head_image"); } else { form.AddField("type", "weibo_image"); } form.AddField("guid", GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid.ToString()); form.AddField("server_id", LoginData.GetServerListDataByID(PlayerPreferenceData.LastServer).m_id.ToString()); string imgField = uploadImages.Count > 1 ? "image[]" : "image"; for (int i = 0; i < uploadImages.Count; ++i) { byte[] bytes = uploadImages[i].EncodeToPNG(); form.AddBinaryData(imgField, bytes, i + ".png", "image/png"); } // Upload to a cgi script WWW w = new WWW(url, form); yield return w; if (!string.IsNullOrEmpty(w.error)) { if (_UploadFail != null) _UploadFail.Invoke(null); LogModule.ErrorLog("image upload error:" + w.error); } else { string result = w.text; LogModule.DebugLog(result); var uploadRet = JsonUtility.FromJson(result); if (uploadRet.errno != 0) { GUIData.AddNotifyData(uploadRet.msg); _UploadFail.Invoke(null); } else { if (_UploadSucess != null) _UploadSucess.Invoke(new List(uploadRet.data)); for (int i = 0; i < uploadImages.Count; ++i) { AddImagePath(uploadRet.data[i], uploadImages[i]); } } LogModule.DebugLog("Finished Uploading Screenshot"); } } #endregion #region info from json [System.Serializable] public class ImgUploadRet { public int errno; public string msg; public string[] data; } [System.Serializable] public class ImgDownloadRet { public int errno; public string msg; public ImgInfo[] data; } [System.Serializable] public class ImgInfo { public string key; public int status; public string url; } #endregion }