javascript - 如何从文件读取器返回调整大小的图像

标签 javascript reactjs typescript canvas filereader

我创建了一个负责调整图像大小的函数,现在我想从该函数返回调整大小的图像。

我正在使用 react 并知道我可以通过使用 state 解决问题,但我不喜欢这个解决方案..

尝试返回每个不同的范围,但我仍然收到 undefined 响应。另外,当我返回reader本身时,我得到了旧数据。

界面

   interface IHTMLInputEvent extends Event {
        target: HTMLInputElement & EventTarget;
    }

调整大小功能

function resizeImage(file: IHTMLInputEvent, width: number) {

        const fileName = file.target.files[0].name;
        const reader = new FileReader();

        reader.readAsDataURL(file.target.files[0]);

        reader.onload = (event) => {
            const img = new Image();
            img.src = event.target.result.toString();

            img.onload = () => {
                const elem = document.createElement('canvas');
                const scaleFactor = width / img.width;
                elem.width = width;
                elem.height = img.height * scaleFactor;

                const ctx = elem.getContext('2d');
                ctx.drawImage(img, 0, 0, width, img.height * scaleFactor);

                ctx.canvas.toBlob((blob) => {
                    return new File([blob], fileName, { type: 'image/jpeg', lastModified: Date.now() });
                }, 'image/jpeg', 1);
            };
        };
    }

处理上传的函数(到目前为止)

function handleUpload(e: IHTMLInputEvent) {
        const resizedImage = resizeImage(e, 600);
    }

输入字段

 <input 
   className={classes.inputForUpload} 
   accept='image/*' 
   type='file' 
   ref={uploadImage} 
   onChange={(e: IHTMLInputEvent) => handleUpload(e)} 
  />

我想返回新创建的图像。

最佳答案

你可以使用 Promise 来解决这个问题,

function resizeImage(file: IHTMLInputEvent, width: number) {

  return new Promise((resolve, reject) => {

    const fileName = file.target.files[0].name;
    const reader = new FileReader();

    reader.readAsDataURL(file.target.files[0]);

    reader.onload = (event) => {
      const img = new Image();
      img.src = event.target.result.toString();

      img.onload = () => {
        const elem = document.createElement('canvas');
        const scaleFactor = width / img.width;
        elem.width = width;
        elem.height = img.height * scaleFactor;

        const ctx = elem.getContext('2d');
        ctx.drawImage(img, 0, 0, width, img.height * scaleFactor);

        ctx.canvas.toBlob((blob) => {
          resolve(new File([blob], fileName, {
            type: 'image/jpeg',
            lastModified: Date.now()
          }));
        }, 'image/jpeg', 1);
      };
    };
  });
}

使用异步等待

async function handleUpload(e: IHTMLInputEvent) {
  const resizedImage = await resizeImage(e, 600);

  // do you suff here
}

JSX,

<input 
   className={classes.inputForUpload} 
   accept='image/*' 
   type='file' 
   ref={uploadImage} 
   onChange={async (e: IHTMLInputEvent) => await handleUpload(e)} 
/>

关于javascript - 如何从文件读取器返回调整大小的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58104645/

相关文章:

javascript - JSX map 中的分隔符使用索引

reactjs - Typeorm + Firebase 函数 : "No connection options were found in any orm configuration files" after deployed

javascript - 如何从数组中删除所有元素

javascript - 如何退出 .JS 进程以便它向 AHK 返回 StdOut 值?

javascript - 覆盖 Angular 的 Service Worker 来处理 POST 请求

javascript - Spring Boot REST - 所需的字符串参数不存在

typescript - 如何在 typescript 中使用静态方法扩展和键入导入的类

angular - 在整个项目中共享 Angular Material 模块

angular - 按下(单击)按钮时调用 (ngSubmit)

javascript - 在 Angular 8 中的另一个应用程序中引用服务代码