Это можно сделать в браузерах, которые поддерживают новый File API из W3C, используя функцию readAsDataURL
в интерфейсе FileReader
и назначая URL-адрес данных для src
из img
(после чего вы можете прочитать height
и width
изображения). В настоящее время Firefox 3.6 поддерживает File API, и я думаю, что Chrome и Safari уже поддерживают или собираются это сделать.
Итак, ваша логика на переходном этапе будет выглядеть примерно так:
Определить, поддерживает ли браузер File API (это просто: if (typeof window.FileReader === 'function')
).
Если это так, отлично, прочитайте данные локально и вставьте их в изображение, чтобы найти размеры.
Если нет, загрузите файл на сервер (возможно, отправив форму из iframe, чтобы не покидать страницу), а затем опросите сервер, спрашивая, насколько велико изображение (или просто запрашивайте загруженное изображение, если вы предпочитаете).
Редактировать Я имел в виду некоторое время прорабатывать пример File API; вот один:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show Image Dimensions Locally</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function loadImage() {
var input, file, fr, img;
if (typeof window.FileReader !== 'function') {
write("The file API isn't supported on this browser yet.");
return;
}
input = document.getElementById('imgfile');
if (!input) {
write("Um, couldn't find the imgfile element.");
}
else if (!input.files) {
write("This browser doesn't seem to support the `files` property of file inputs.");
}
else if (!input.files[0]) {
write("Please select a file before clicking 'Load'");
}
else {
file = input.files[0];
fr = new FileReader();
fr.onload = createImage;
fr.readAsDataURL(file);
}
function createImage() {
img = document.createElement('img');
img.onload = imageLoaded;
img.style.display = 'none'; // If you don't want it showing
img.src = fr.result;
document.body.appendChild(img);
}
function imageLoaded() {
write(img.width + "x" + img.height);
// This next bit removes the image, which is obviously optional -- perhaps you want
// to do something with it!
img.parentNode.removeChild(img);
img = undefined;
}
function write(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
}
</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='imgfile'>
<input type='button' id='btnLoad' value='Load' onclick='loadImage();'>
</form>
</body>
</html>
Отлично работает на Firefox 3.6. Я избегал использования там какой-либо библиотеки, поэтому извиняюсь за обработчики событий в стиле атрибута (DOM0) и тому подобное.