1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
const fileToImg = (file: File): Promise<HTMLImageElement> => { return new Promise((resolve, reject) => { const reader = new FileReader(); const img = new Image(); reader.readAsDataURL(file); reader.onload = () => { img.src = reader.result as string; }; reader.onerror = e => { reject(e); }; img.onload = () => { resolve(img); }; img.onerror = e => { reject(e); }; }); };
const imgToBlob = ( img: HTMLImageElement, maxWidth: number, maxHeight: number, quality: number, type = "image/png", ): Promise<Blob> => { return new Promise((resolve, reject) => { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d");
const { width: originWidth, height: originHeight } = img; let targetWidth = originWidth, targetHeight = originHeight; if (targetWidth > maxWidth || targetHeight > maxHeight) { if (targetWidth > targetHeight) { targetWidth = maxWidth; targetHeight = targetHeight * (maxWidth / originWidth); } else { targetHeight = maxHeight; targetWidth = targetWidth * (maxHeight / originHeight); } } try { canvas.width = targetWidth; canvas.height = targetHeight; ctx?.clearRect(0, 0, targetWidth, targetHeight); ctx?.drawImage(img, 0, 0, targetWidth, targetHeight); canvas.toBlob( blob => { if (blob) { resolve(blob); } else { reject(new Error("转换失败")); } }, type, quality, ); } catch (error) { reject(error); } }); };
const inp = document.querySelector("#input"); inp?.addEventListener("change", async e => { const inputEle = e.target as HTMLInputElement; if (inputEle.files?.length) { const img = await fileToImg(inputEle.files[0]); const blob = await imgToBlob(img, 1000, 1000, 0.2); console.log(blob); } });
|