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