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

547 lines
17 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.IO;
using Module.Log;
public class ImageManagerRoot : UIControllerBase<ImageManagerRoot>
{
#region
public static void ShowImageCutStatic(CuttedPhoto callBack)
{
UIManager.ShowUI(UIInfo.ImageManagerRoot, (sucess, param) =>
{
ImageManagerRoot.Instance()._CuttedPhotoCallback = callBack;
ImageManagerRoot.Instance().SelectCuttedPhote();
});
}
public static void ShowImageCameraStatic(CuttedPhoto callBack)
{
UIManager.ShowUI(UIInfo.ImageManagerRoot, (sucess, param) =>
{
ImageManagerRoot.Instance()._CuttedPhotoCallback = callBack;
ImageManagerRoot.Instance().SelectWebCamTexture();
});
}
public void Start()
{
SetInstance(this);
InitReciver();
}
public void Close()
{
UIManager.CloseUI(UIInfo.ImageManagerRoot);
}
public void Update()
{
CameraUpdate();
UpdateLoadImage();
}
#endregion
#region load image
void InitReciver()
{
var uiGO = GameObject.Find("UI Root");
var imageReciver = uiGO.GetComponent<ImageSelectReciver>();
if (imageReciver == null)
imageReciver = uiGO.AddComponent<ImageSelectReciver>();
imageReciver._ImageSelectTool = this;
}
public void SelectCuttedPhote()
{
_CamPanel.SetActive(false);
_CutImgPanel.SetActive(false);
//gameObject.SetActive(true);
//InitReciver();
_OrgPhoto = null;
_OrgPhotoImage.texture = null;
int maxSize = Screen.width * 2;
maxSize = Mathf.Min(2560, maxSize);
#if UNITY_IPHONE && !UNITY_EDITOR
//调用插件自带接口,拉取相册,内部有区分平台
NativeGallery.Permission permission = NativeGallery.GetImageFromGallery((path) =>
{
Debug.Log("Image path: " + path);
if (path != null)
{
// 此Action为选取图片后的回调返回一个Texture2D
Texture2D texture = NativeGallery.LoadImageAtPath(path, maxSize);
if (texture == null)
{
Debug.Log("Couldn't load texture from " + path);
return;
}
_OrgPhoto = texture;
Debug.Log(texture.name);
//var readableTex = duplicateTexture(texture);
//ShowImageCut(readableTex);
}
}, "选择图片", "image/png", maxSize);
Debug.Log("Permission result: " + permission);
#elif UNITY_ANDROID && !UNITY_EDITOR
NativeGallery.Permission permission = NativeGallery.GetImageFromGallery((path) =>
{
Debug.Log("Image path: " + path);
if (path != null)
{
// 此Action为选取图片后的回调返回一个Texture2D
Texture2D texture = NativeGallery.LoadImageAtPath(path, maxSize);
if (texture == null)
{
Debug.Log("Couldn't load texture from " + path);
return;
}
_OrgPhoto = texture;
Debug.Log(texture.name);
//var readableTex = duplicateTexture(texture);
//ShowImageCut(readableTex);
}
}, "选择图片", "image/png", maxSize);
Debug.Log("Permission result: " + permission);
#else
LoadWindFile.LoadImage(GetImagePath);
#endif
}
private Texture2D duplicateTexture(Texture2D source)
{
RenderTexture renderTex = RenderTexture.GetTemporary(
source.width,
source.height,
0,
RenderTextureFormat.Default,
RenderTextureReadWrite.Linear);
Graphics.Blit(source, renderTex);
RenderTexture previous = RenderTexture.active;
RenderTexture.active = renderTex;
Texture2D readableText = new Texture2D(source.width, source.height);
readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
readableText.Apply();
RenderTexture.active = previous;
RenderTexture.ReleaseTemporary(renderTex);
return readableText;
}
public void GetImagePath(string path)
{
if (string.IsNullOrEmpty(path))
return;
GuiTextDebug.debug("GetImagePath:" + path);
StartCoroutine(LoadLocalImage(path));
}
public void UpdateLoadImage()
{
if (_OrgPhoto != null && _OrgPhotoImage.texture == null)
{
var readableTex = duplicateTexture(_OrgPhoto);
ShowImageCut(readableTex);
}
}
IEnumerator LoadLocalImage(string fileName)
{
string filePath = "";
#if UNITY_IPHONE && !UNITY_EDITOR
filePath = "file://" + fileName;
#elif UNITY_ANDROID && !UNITY_EDITOR
filePath = "file://" + fileName;
#else
filePath = "file://" + fileName;
#endif
string exName = Path.GetExtension(fileName);
exName = exName.ToLower();
if (!exName.Equals(".jpg") && !exName.Equals(".png"))
{
LogModule.ErrorLog("Img file:" + fileName + ", load error");
GUIData.AddNotifyData("#{39030}");
yield break;
}
WWW wwwTexture = new WWW(filePath);
LogModule.DebugLog(wwwTexture.url);
yield return wwwTexture;
if (!string.IsNullOrEmpty(wwwTexture.error))
{
GUIData.AddNotifyData("#{39031}");
LogModule.ErrorLog("LoadImageError:" + wwwTexture.error + ", " + fileName);
}
else
{
var texture2d = wwwTexture.texture;
ShowImageCut(texture2d);
}
}
#endregion
#region camera image
public GameObject _CamPanel;
public RawImage _CameraTexture;
private WebCamTexture _WebCamTexture;
public void SelectWebCamTexture()
{
StartCoroutine(StartWebCam());
}
public void CameraUpdate()
{
if (_WebCamTexture != null)
{
if (Screen.orientation == ScreenOrientation.LandscapeRight)
{
_CameraTexture.transform.rotation = Quaternion.Euler(0, 0, 180);
}
else
{
_CameraTexture.transform.rotation = Quaternion.Euler(0, 0, 0);
}
}
}
public IEnumerator StartWebCam()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
WebCamDevice[] devices = WebCamTexture.devices;
if (devices.Length == 0)
{
GUIData.AddNotifyData(GCGame.Table.StrDictionary.GetClientDictionaryString("#{39023}"));
Close();
yield break;
}
_CamPanel.gameObject.SetActive(true);
var deviceName = devices[0].name;
_WebCamTexture = new WebCamTexture(deviceName, Screen.width, Screen.height, 12);
_WebCamTexture.Play();
_CameraTexture.texture = _WebCamTexture;
}
else
{
GUIData.AddNotifyData(GCGame.Table.StrDictionary.GetClientDictionaryString("#{39023}"));
Close();
}
}
public void OnBtnCameraOk()
{
Texture2D bla = new Texture2D(_WebCamTexture.width, _WebCamTexture.height);
if (Screen.orientation == ScreenOrientation.LandscapeRight)
{
for (int i = 0; i < _WebCamTexture.width; ++i)
{
for (int j = 0; j < _WebCamTexture.height; ++j)
{
bla.SetPixel(i, j, _WebCamTexture.GetPixel(_WebCamTexture.width - i, _WebCamTexture.height - j));
}
}
}
else
{
for (int i = 0; i < _WebCamTexture.width; ++i)
{
for (int j = 0; j < _WebCamTexture.height; ++j)
{
bla.SetPixel(i, j, _WebCamTexture.GetPixel(i, j));
}
}
}
bla.Apply();
if (bla != null)
{
ShowImageCut(bla);
}
else
{
Close();
}
_CamPanel.gameObject.SetActive(false);
_WebCamTexture.Stop();
_WebCamTexture = null;
}
#endregion
#region cutted image
public GameObject _CutImgPanel;
public RawImage _OrgPhotoImage;
public Vector2 _CutSize;
private int _ScollImageXMin;
private int _ScollImageXMax;
private int _ScollImageYMin;
private int _ScollImageYMax;
private Texture2D _OrgPhoto;
public delegate void CuttedPhoto(Texture2D cuttedImg);
public CuttedPhoto _CuttedPhotoCallback;
private Vector2 _TextureOrgSize;
private float _LargeRate;
private float _SmallRate;
private float _CurRate;
private static float _MaxOrgSizeRate = 2f;
private static float _SizeStep = 0.1f;
public void ShowImageCut(Texture2D orgPhoto)
{
if (orgPhoto == null)
{
Close();
return;
}
_CutImgPanel.SetActive(true);
_OrgPhoto = orgPhoto;
_OrgPhotoImage.texture = orgPhoto;
_OrgPhotoImage.color = new Color(1, 1, 1);
//_OrgPhotoImage.texture = orgPhoto;
_OrgPhotoImage.rectTransform.sizeDelta = new Vector2(orgPhoto.width, orgPhoto.height);
_OrgPhotoImage.rectTransform.anchoredPosition = Vector2.zero;
_TextureOrgSize = new Vector2(orgPhoto.width, orgPhoto.height);
Debug.Log("_TextureOrgSize:" + _TextureOrgSize);
//最大放大倍数原图的2.5倍或屏幕的两倍;缩小倍数cutSizeX
if (_TextureOrgSize.x > _TextureOrgSize.y)
{
_LargeRate = Mathf.Min(_MaxOrgSizeRate, Screen.width * 2 / _TextureOrgSize.x);
_LargeRate = Mathf.Max(_CutSize.x / _TextureOrgSize.x, _LargeRate);
_SmallRate = _CutSize.y / _TextureOrgSize.y;
if (_TextureOrgSize.x > Screen.width)
{
_CurRate = Screen.width / _TextureOrgSize.x;
}
else if (_TextureOrgSize.y < _CutSize.y)
{
_CurRate = _TextureOrgSize.y / _CutSize.y;
}
else
{
_CurRate = 1;
}
}
else
{
_LargeRate = Mathf.Min(_MaxOrgSizeRate, Screen.height * 2 / _TextureOrgSize.y);
_LargeRate = Mathf.Max(_CutSize.y / _TextureOrgSize.y, _LargeRate);
_SmallRate = _CutSize.x / _TextureOrgSize.x;
if (_TextureOrgSize.y > Screen.height)
{
_CurRate = Screen.height / _TextureOrgSize.y;
}
else if (_TextureOrgSize.x < _CutSize.x)
{
_CurRate = _TextureOrgSize.x / _CutSize.x;
}
else
{
_CurRate = 1;
}
}
if (_LargeRate < _SmallRate)
{
_LargeRate = _SmallRate;
}
_CurRate = Mathf.Clamp(_CurRate, _SmallRate, _LargeRate);
_OrgPhotoImage.rectTransform.sizeDelta = new Vector2(_TextureOrgSize.x * _CurRate, _TextureOrgSize.y * _CurRate);
Debug.Log("LargeRate:" + _LargeRate + ", SmallRate:" + _SmallRate + ", CurRate:" + _CurRate);
Resize();
}
public void Resize()
{
_ScollImageXMin = (int)(-(_TextureOrgSize.x * _CurRate * 0.5f - _CutSize.x * 0.5f));
_ScollImageXMax = (int)(-_ScollImageXMin);
if (_TextureOrgSize.x * _CurRate < _CutSize.x)
{
_ScollImageXMin = 0;
_ScollImageXMax = 0;
}
_ScollImageYMin = (int)(-(_TextureOrgSize.y * _CurRate * 0.5f - _CutSize.y * 0.5f));
_ScollImageYMax = (int)(-_ScollImageYMin);
if (_TextureOrgSize.y * _CurRate < _CutSize.y)
{
_ScollImageYMin = 0;
_ScollImageYMax = 0;
}
Debug.Log("_ScollImageYMin:" + _ScollImageXMin + "," + _ScollImageYMin);
}
public void ScollImage(Vector2 direct)
{
var modifyDirect = direct;
Vector2 newAnchorPos = _OrgPhotoImage.rectTransform.anchoredPosition + modifyDirect;
newAnchorPos.x = Mathf.Clamp(newAnchorPos.x, _ScollImageXMin, _ScollImageXMax);
newAnchorPos.y = Mathf.Clamp(newAnchorPos.y, _ScollImageYMin, _ScollImageYMax);
_OrgPhotoImage.rectTransform.anchoredPosition = newAnchorPos;
}
public void CutImage()
{
/*var cameraTexture = RenderTexturePool.Instance.GetRenderTexture(new Vector2(1280, 760));
var mainCamera = UIManager.Instance().UICamera;
Texture2D readableText = new Texture2D(cameraTexture.width, cameraTexture.height);
if (mainCamera != null)
{
var temp = mainCamera.targetTexture;
mainCamera.targetTexture = cameraTexture;
var mainCameraState = mainCamera.enabled;
mainCamera.enabled = true;
mainCamera.Render();
RenderTexture.active = cameraTexture;
readableText.ReadPixels(new Rect(0, 0, cameraTexture.width, cameraTexture.height), 0, 0);
readableText.Apply();
mainCamera.enabled = mainCameraState;
mainCamera.targetTexture = temp;
}
Debug.Log("readableText:" + readableText.width + "," + readableText.height);
int cutSizeX = (int)_CutSize.x;
int cutSizeY = (int)_CutSize.y;
Texture2D rectPhoto = new Texture2D(cutSizeX, cutSizeY, TextureFormat.ARGB32, true);
int startPosx = (int)(readableText.width * 0.5f - cutSizeX * 0.5f);
int startPosY = (int)(readableText.height * 0.5f - cutSizeY * 0.5f);
//int startPosx = 0;
//int startPosY = 0;
for (int i = 0; i < cutSizeX; ++i)
{
for (int j = 0; j < cutSizeY; ++j)
{
var color = readableText.GetPixel(i + startPosx, j + startPosY);
rectPhoto.SetPixel(i, j, color);
//LogModule.DebugLog("Color:" + color);
}
}*/
int cutSizeX = Mathf.Min((int)_CutSize.x, _OrgPhoto.width);
int cutSizeY = Mathf.Min((int)_CutSize.y, _OrgPhoto.height);
if (cutSizeX > cutSizeY)
{
cutSizeX = cutSizeY;
}
else
{
cutSizeY = cutSizeX;
}
int cutPosX = (int)-((_OrgPhotoImage.rectTransform.anchoredPosition.x + _ScollImageXMin) / _CurRate);
int cutPosY = (int)-((_OrgPhotoImage.rectTransform.anchoredPosition.y + _ScollImageYMin) / _CurRate);
LogModule.DebugLog("CutPos:" + cutPosX + "," + cutPosY);
LogModule.DebugLog("CutSize:" + cutSizeX + "," + cutSizeY);
Texture2D rectPhoto = new Texture2D(cutSizeX, cutSizeY, TextureFormat.ARGB32, true);
for (int i = 0; i < cutSizeX; ++i)
{
for (int j = 0; j < cutSizeY; ++j)
{
if (cutSizeX < _OrgPhoto.width && cutSizeY < _OrgPhoto.height)
{
var color = _OrgPhoto.GetPixel((int)(i / _CurRate + cutPosX), (int)(j / _CurRate + cutPosY));
rectPhoto.SetPixel(i, j, color);
}
else
{
var color = _OrgPhoto.GetPixel((int)(i + cutPosX), (int)(j + cutPosY));
rectPhoto.SetPixel(i, j, color);
}
}
}
rectPhoto.Apply();
if (_CuttedPhotoCallback != null)
{
_CuttedPhotoCallback.Invoke(rectPhoto);
}
Close();
//StartCoroutine(ApplyCuttedTexture(rectPhoto));
}
public void OnBtnTextureExpend()
{
_CurRate += _SizeStep;
_CurRate = Mathf.Clamp(_CurRate, _SmallRate, _LargeRate);
_OrgPhotoImage.rectTransform.sizeDelta = new Vector2(_TextureOrgSize.x * _CurRate, _TextureOrgSize.y * _CurRate);
Resize();
ScollImage(Vector2.zero);
}
public void OnBtnTextureNarrow()
{
_CurRate -= _SizeStep;
_CurRate = Mathf.Clamp(_CurRate, _SmallRate, _LargeRate);
_OrgPhotoImage.rectTransform.sizeDelta = new Vector2(_TextureOrgSize.x * _CurRate, _TextureOrgSize.y * _CurRate);
Resize();
ScollImage(Vector2.zero);
}
private IEnumerator ApplyCuttedTexture(Texture2D rectPhoto)
{
yield return new WaitForEndOfFrame();
rectPhoto.Apply();
if (_CuttedPhotoCallback != null)
{
_CuttedPhotoCallback.Invoke(rectPhoto);
}
gameObject.SetActive(false);
}
#endregion
}