| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ==================================================================== |
| | | // IM å¾çå·¥å
· |
| | | // ==================================================================== |
| | | // - probeImageSizeï¼å è½½æ¬å° File æè¿ç¨ URLï¼è¯»åº naturalWidth / naturalHeight |
| | | // - loadImageï¼å è½½è¿ç¨ URL å° HTMLImageElementï¼å¤±è´¥è¿å nullï¼ä¸æéï¼ï¼ä¾ canvas ç»å¶ä½¿ç¨ |
| | | // ==================================================================== |
| | | |
| | | /** é»è®¤å ä½å°ºå¯¸ï¼probe 失败 / è§£ç å¼å¸¸æ¶å
åºï¼é¿å
width/height 为 0 è®©æ¶æ¯æ¸²æå¡æ */ |
| | | const DEFAULT_FALLBACK_SIZE = { width: 200, height: 200 } as const |
| | | |
| | | /** å è½½è¿ç¨ URL å° HTMLImageElementï¼å¤±è´¥è¿å nullï¼canvas ç»å¶è¦æ± 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ï¼è·¨åä¹è½æ¿å°ï¼ |
| | | * - è§£ç 失败 / 䏿¯å¾çï¼è¿å 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 |
| | | }) |
| | | } |