前端如何判断上传图片尺寸(宽度和高度)

在上传图片时,存在需要判断图片的宽高是否符合需求的场景(如指定 Icon 尺寸)。那么前端如何判断上传图片尺寸(宽度和高度)?

实现

核心实现

javascript 复制代码
const img = new Image();
img.onload = function() {
  const width = img.width;
  const height = img.height;
}
img.src = 'https://www.gstatic.com/webp/gallery/1.jpg'
  1. 创建一个 Image 对象
  2. 设置 Image 对象的 src 属性
  3. 在加载完成后检测尺寸。通过 widthheight 属性

上传中获取

一般需要判断上传图片尺寸的场景都是在上传图片时,需要判断。上传图片完成后,只需要通过 FileReader 或者 URL.createObjectURL(file) 将图片文件转换为临时 URL 并将其赋值给 Image 对象的 src 属性

html 复制代码
<input type="file" id="imageInput" accept="image/*">
<p id="output"></p>

<script>
  document.getElementById('imageInput').addEventListener('change', function (event) {
    const file = event.target.files[0];
    if (file) {
       const reader = new FileReader();
        reader.onload = function(e) {
            const img = new Image();
            img.onload = function() {
                const width = img.width;
                const height = img.height;
                document.getElementById('output').textContent = `Image Dimensions: ${width} x ${height}`;
            }
            img.src = e.target.result;
        }
  
        reader.readAsDataURL(file);
    } else {
      document.getElementById('output').textContent = 'No file selected';
    }
  });
</script>

封装一下

将从上传的图片文件中获取 src 和获取图片尺寸的函数使用 Promise 封装一下,可以更方便复用

javascript 复制代码
function getImageSize(src) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = function () {
      const width = img.width;
      const height = img.height;
      resolve({ width, height })
    }
    img.src = src
  })
}

function getImageSrcFromFile(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = function (e) {
      resolve(e.target.result)
    }
    reader.readAsDataURL(file);
  })
}

function getImageSrc(file) {
  return URL.createObjectURL(file)
  // 注意后续需要调用 URL.revokeObjectURL(src) 释放内存
}

使用:

javascript 复制代码
document.getElementById('imageInput').addEventListener('change', async function (event) {
  const file = event.target.files[0];
  if (file) {
    const src = await getImageSrcFromFile(file);
    const { width, height } = await getImageSize(src);
    document.getElementById('output').textContent = `Image Dimensions: ${width} x ${height}`;
  } else {
    document.getElementById('output').textContent = 'No file selected';
  }
});

参考链接

相关推荐
hedley(●'◡'●)5 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_8115175157 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育8 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再8 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose34 分钟前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花40 分钟前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员1 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵2 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css
小杨同学呀呀呀呀2 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue