From b64a0deae5b5d33f9e20671a68936b27f0b9b00b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 21 七月 2026 18:03:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0

---
 src/views/im/utils/image.ts |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/src/views/im/utils/image.ts b/src/views/im/utils/image.ts
new file mode 100644
index 0000000..207947d
--- /dev/null
+++ b/src/views/im/utils/image.ts
@@ -0,0 +1,57 @@
+// ====================================================================
+// IM 鍥剧墖宸ュ叿
+// ====================================================================
+// - probeImageSize锛氬姞杞芥湰鍦� File 鎴栬繙绋� URL锛岃鍑� naturalWidth / naturalHeight
+// - loadImage锛氬姞杞借繙绋� URL 鍒� HTMLImageElement锛堝け璐ヨ繑鍥� null锛屼笉鎶涢敊锛夛紝渚� canvas 缁樺埗浣跨敤
+// ====================================================================
+
+/** 榛樿鍗犱綅灏哄锛歱robe 澶辫触 / 瑙g爜寮傚父鏃跺厹搴曪紝閬垮厤 width/height 涓� 0 璁╂秷鎭覆鏌撳鎺� */
+const DEFAULT_FALLBACK_SIZE = { width: 200, height: 200 } as const
+
+/** 鍔犺浇杩滅▼ URL 鍒� HTMLImageElement锛屽け璐ヨ繑鍥� null锛沜anvas 缁樺埗瑕佹眰 crossOrigin=anonymous锛堥粯璁ゅ紑锛� */
+export function loadImage(
+  src: string,
+  options: { crossOrigin?: 'anonymous' | 'use-credentials' | null } = {}
+): Promise<HTMLImageElement | null> {
+  const crossOrigin = options.crossOrigin === undefined ? 'anonymous' : options.crossOrigin
+  return new Promise((resolve) => {
+    const img = new Image()
+    if (crossOrigin) {
+      img.crossOrigin = crossOrigin
+    }
+    img.addEventListener('load', () => resolve(img))
+    img.addEventListener('error', () => resolve(null))
+    img.src = src
+  })
+}
+
+/**
+ * 鍔犺浇鏈湴 File 鎴栬繙绋� URL锛岃В鍑� naturalWidth / naturalHeight
+ *
+ * - File锛氬唴閮� createObjectURL + revokeObjectURL锛岄伩鍏嶅唴瀛樼疮绉�
+ * - 杩滅▼ URL锛氱洿鎺ヨ蛋 <img>.src 瑙﹀彂娴忚鍣ㄥ姞杞斤紙鍙� CORS 褰卞搷锛涘彧璇诲昂瀵镐笉闇�瑕佺敾 canvas锛岃法鍩熶篃鑳芥嬁鍒帮級
+ * - 瑙g爜澶辫触 / 涓嶆槸鍥剧墖锛氳繑鍥� 200脳200 鍏滃簳
+ */
+export function probeImageSize(source: File | string): Promise<{ height: number; width: number; }> {
+  const isFile = source instanceof File
+  const src = isFile ? URL.createObjectURL(source) : source
+  return new Promise((resolve) => {
+    const img = new Image()
+    img.addEventListener('load', () => {
+      if (isFile) {
+        URL.revokeObjectURL(src)
+      }
+      resolve({
+        width: img.naturalWidth || DEFAULT_FALLBACK_SIZE.width,
+        height: img.naturalHeight || DEFAULT_FALLBACK_SIZE.height
+      })
+    })
+    img.addEventListener('error', () => {
+      if (isFile) {
+        URL.revokeObjectURL(src)
+      }
+      resolve({ ...DEFAULT_FALLBACK_SIZE })
+    })
+    img.src = src
+  })
+}

--
Gitblit v1.9.3