通过Javascript确定图像文件大小+尺寸?

IT技术 javascript image
2021-01-18 01:51:48

作为网络应用程序的一部分,一旦图像被下载并呈现在网页上,我需要在浏览器上下文中确定图像的文件大小 (kb) 和分辨率(例如,我可以在页面上显示该信息. 显然,这需要在客户端完成。必须能够在没有 ActiveX 控件或 Java 小程序(IE7+、FF3+、Safari 3+、IE6 很好)的情况下解决 x-browser,尽管它不必每个浏览器都是相同的解决方案。

理想情况下,这将使用系统 Javascript 来完成,但如果我绝对需要一个 JQuery 或类似的库(或它的一个很小的子集),那是可以完成的。

6个回答

编辑

要获取不包括边框和边距的 DOM 元素(在您的情况下为 IMG 元素)的当前浏览器内像素大小,您可以使用clientWidthclientHeight属性。

var img = document.getElementById('imageId'); 

var width = img.clientWidth;
var height = img.clientHeight;

现在要获取文件大小,现在我只能考虑Internet Explorer 为文档和IMG元素公开fileSize 属性...

编辑2:我想到了一些事情......

要获取托管在服务器上的文件的大小,您可以简单地使用 Ajax发出HEAD HTTP 请求这种请求用于获取请求隐含的 url 的元信息,而不在响应中传输它的任何内容。

在 HTTP 请求结束时,我们可以访问响应 HTTP 标头,包括表示文件大小(以字节为单位)Content-Length

使用原始XHR 的基本示例

var xhr = new XMLHttpRequest();
xhr.open('HEAD', 'img/test.jpg', true);
xhr.onreadystatechange = function(){
  if ( xhr.readyState == 4 ) {
    if ( xhr.status == 200 ) {
      alert('Size in bytes: ' + xhr.getResponseHeader('Content-Length'));
    } else {
      alert('ERROR');
    }
  }
};
xhr.send(null);

注意:请记住,当您执行 Ajax 请求时,您会受到同源策略的限制,该策略允许您仅在同一域内发出请求。

在此处检查概念的工作证明

编辑3:

1.) 关于内容长度,我认为可能会发生大小不匹配的情况,例如,如果服务器响应被 gzip 压缩,您可以进行一些测试,看看这是否发生在您的服务器上。

2.) 要获取图像的原始尺寸,您可以以编程方式创建 IMG 元素,例如:

var img = document.createElement('img');

img.onload = function () { alert(img.width + ' x ' + img.height); };

img.src='http://sstatic.net/so/img/logo.png';
这是旧的,但对于edit 3,您可以直接获取 imgnaturalWidthnaturalHeight属性,而不是创建新的 img 元素
2021-03-16 01:51:48
谢谢。一些后续问题:1)对于可以增加大小的 jpg 会发生什么样的编码?2)如果在浏览器中调整图像大小,有没有办法获得原始图像尺寸?
2021-03-20 01:51:48
万一其他人好奇地尝试这个,chrome 至少会在数据 url 上抛出跨站点脚本错误(即来自 canvas.toDataURL() 结果)。这显然是预期的行为。
2021-03-30 01:51:48
请注意,内容长度 >= 实际文件大小,因为可以对数据进行编码以进行传输。
2021-04-01 01:51:48
嗯对我不起作用,我做错了什么(它显示我 0 )?$("#temp_image").html('<img src="uploads/obr1.jpg" alt="" id="tmp" />'); var img = document.getElementById('tmp'); 警报(img.clientWidth);
2021-04-06 01:51:48

使用Javascript检查上传的图像大小

<script type="text/javascript">
    function check(){
      var imgpath=document.getElementById('imgfile');
      if (!imgpath.value==""){
        var img=imgpath.files[0].size;
        var imgsize=img/1024; 
        alert(imgsize);
      }
    }
</script>

html代码

<form method="post" enctype="multipart/form-data" onsubmit="return check();">
<input type="file" name="imgfile" id="imgfile"><br><input type="submit">
</form>
浏览器将文件上传文件显示为按钮,在这里我们可以浏览并选择一个文件。所以我没有设置文件上传的值
2021-03-27 01:51:48
我真的很喜欢这个 hack :) 但遗憾的是你不能设置文件上传输入元素的值 :(
2021-03-31 01:51:48

获取图像的原始尺寸

如果您需要获取原始图像尺寸(不在浏览器上下文中),则clientWidthclientHeight属性不起作用,因为如果通过 css 拉伸/收缩图像,它们将返回不正确的值。

要获取原始图像尺寸,请使用naturalHeightnaturalWidth属性。

var img = document.getElementById('imageId'); 

var width = img.naturalWidth;
var height = img.naturalHeight;

ps这不能回答原始问题,因为接受的答案可以解决问题。相反,这就像对它的补充一样。

这个怎么样:

var imageUrl = 'https://cdn.sstatic.net/Sites/stackoverflow/img/sprites.svg';
var blob = null;
var xhr = new XMLHttpRequest(); 
xhr.open('GET', imageUrl, true); 
xhr.responseType = 'blob';
xhr.onload = function() 
{
    blob = xhr.response;
    console.log(blob, blob.size);
}
xhr.send();

http://qnimate.com/javascript-create-file-object-from-url/

由于同源政策,只能在同源下工作

关于宽度和高度:

var img = document.getElementById('imageId'); 

var width = img.clientWidth;
var height = img.clientHeight;

关于您可以使用的文件大小 performance

var size = performance.getEntriesByName(url)[0];
console.log(size.transferSize); // or decodedBodySize might differ if compression is used on server side