Files
JJBB/Assets/Project/Script/GUI/Community/NetImage.cs
2024-08-23 15:49:34 +08:00

580 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<Image>();
//InitImageUrl();
SetUsingImage(this);
}
private void OnDestroy()
{
RemoveUsingImage(this);
}
#region image catch
private static Dictionary<string, string> _CatchImages;
private static Dictionary<string, List<GetImageCallBack>> _LoadingImgCallBack = new Dictionary<string, List<GetImageCallBack>>();
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<GetImageCallBack>());
_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<ImgDownloadRet>(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<string, string>();
_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<NetImage> _UsingImage = new List<NetImage>();
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<Texture2D>() { 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<string> 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<Texture2D>() { _UploadingImage.NetTexture }, true));
ChangeHeadPic(_UploadingImage._NetImageUrl, _UploadingImage.NetTexture, IMAGE_CHECK_STATE.CHECKING);
}
protected static IEnumerator UploadImage(List<Texture2D> 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<ImgUploadRet>(result);
if (uploadRet.errno != 0)
{
GUIData.AddNotifyData(uploadRet.msg);
_UploadFail.Invoke(null);
}
else
{
if (_UploadSucess != null)
_UploadSucess.Invoke(new List<string>(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
}