前端 javascript 如何获取图片的宽高?

2022-07-30 09:52:56 +08:00
 LeeReamond

想要实现的效果:图片固定按原始大小显示,不随窗口缩放而变化大小。

stackoverflow 查了一番,给的方案似乎都是将图片设置为 div 的 background 这样就不会跟着变了。

但同时我的需求上还需要获取图片宽高。

使用标签的方案下,为 img 添加 onload 事件即可用 img.width 获取图片宽高。但是切换到 div-background 方案后,onload 事件需要用 eventlistener 实现,目前用的大概是下述方案:

let load_image = (src) => {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.addEventListener('load', resolve(img));
    img.addEventListener('error', reject(img));
    img.src = src;
  });
}

load_image(src).then((img) => {
  img_div.style.background = "url("+src+") no-repeat scroll left top transparent";
  console.log(img.width);
});

load_image('/url/to/img.jpg')

比较诡异的是 console.log(image.width);这行打印出来宽度是 0 ,理论上来说我没理解错的话这代码不是在图片 src 加载完成后才执行的回调,为啥会得到 0 的宽度呢。有啥方法获得实际宽高吗?

1552 次点击
所在节点    程序员
8 条回复
toesbieya
2022-07-30 10:01:39 +08:00
img.addEventListener('load', () => resolve(img));
CHCH
2022-07-30 10:01:44 +08:00
resolve 会立马运行吧
Zzzz77
2022-07-30 10:05:26 +08:00
```typescript
const getImageSize = (src: string) => {
return new Promise(resolve => {
const img = document.createElement('img')
img.src = src
img.style.opacity = '0'
document.body.appendChild(img)

img.onload = () => {
const imgWidth = img.clientWidth
const imgHeight = img.clientHeight

img.onload = null
img.onerror = null

document.body.removeChild(img)

resolve({ width: imgWidth, height: imgHeight })
}

img.onerror = () => {
img.onload = null
img.onerror = null
}
})
}
```
sutra
2022-07-30 10:22:28 +08:00
naturalWidth naturalHeight
zhuweiyou
2022-07-30 10:40:38 +08:00
因为你代码写错了, () => resolve(img)
mingdongshensen
2022-07-30 10:47:08 +08:00
代码写错啦
jinliming2
2022-07-30 11:05:09 +08:00
代码错啦,事件是要给回调函数的
LeeReamond
2022-07-30 11:10:28 +08:00
@zhuweiyou
@mingdongshensen
@jinliming2
@Zzzz77
@toesbieya 谢谢,各位方案都有效

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869603

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX