diff --git a/Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs b/Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs
new file mode 100644
index 00000000..751e6819
--- /dev/null
+++ b/Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+
+namespace TEngine
+{
+ ///
+ /// 背景图片等比拉伸
+ ///
+ public class UIBackgroundImageStretch : MonoBehaviour
+ {
+ public bool m_noClip;
+
+ private void Start()
+ {
+ var imageRect = GetComponent();
+ UIStretchUtil.Instance.DoStretch(imageRect, m_noClip);
+ }
+ }
+}
diff --git a/Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs b/Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs
new file mode 100644
index 00000000..a4b2a7a3
--- /dev/null
+++ b/Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs
@@ -0,0 +1,77 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace TEngine
+{
+ public class UIStretchUtil : TSingleton
+ {
+ private bool m_isInit;
+ private Vector2 m_canvasSize;
+ private float m_screenAspect;
+
+ public bool Init()
+ {
+ var goRoot = GameObject.Find("UIRoot/Canvas");
+ if (goRoot == null)
+ {
+ TLogger.LogError("找不到 goRoot");
+ return false;
+ }
+ var canvasScaler = goRoot.GetComponent();
+ if (canvasScaler == null)
+ {
+ TLogger.LogError("找不到 CanvasScaler");
+ return false;
+ }
+
+ m_screenAspect = Screen.width / (float)Screen.height;
+ float designScale = canvasScaler.referenceResolution.x / canvasScaler.referenceResolution.y;
+ if (m_screenAspect > designScale)
+ {
+ //Match 以 Height 为标准
+ m_canvasSize.y = canvasScaler.referenceResolution.y;
+ m_canvasSize.x = m_canvasSize.y * Screen.width / Screen.height;
+ }
+ else
+ {
+ //Match 以 Weight 为标准
+ m_canvasSize.x = canvasScaler.referenceResolution.x;
+ m_canvasSize.y = m_canvasSize.x * Screen.height / Screen.width;
+ }
+ //BLogger.Error("referenceResolution = "+ canvasScaler.referenceResolution);
+ //BLogger.Error("m_canvasSize = " + m_canvasSize);
+
+ m_isInit = true;
+ return true;
+ }
+
+ public void DoStretch(RectTransform rectTransform, bool noClip)
+ {
+ if (!m_isInit)
+ {
+ if (!Init())
+ {
+ return;
+ }
+ }
+ if (rectTransform != null && rectTransform.sizeDelta.x > 0 && rectTransform.sizeDelta.y > 0)
+ {
+ Vector2 rectSize = rectTransform.sizeDelta;
+ var rectAspect = rectSize.x / rectSize.y;
+ if (!noClip && rectAspect > m_screenAspect ||
+ noClip && rectAspect < m_screenAspect)
+ {
+ //以高为标准
+ float scale = m_canvasSize.y / rectSize.y;
+ rectTransform.localScale = new Vector3(scale, scale, 1f);
+ }
+ else
+ {
+ //以宽为标准
+ float scale = m_canvasSize.x / rectSize.x;
+ rectTransform.localScale = new Vector3(scale, scale, 1f);
+ }
+ }
+ }
+ }
+}