Usted puede hacer esto en los navegadores que soportan la nueva File API del W3C, utilizando la función readAsDataURL
en la interfaz FileReader
y la asignación de la dirección URL de datos a la src
de un img
(después de lo cual se puede leer la height
y width
de la imagen). Actualmente Firefox 3.6 es compatible con File API, y creo que Chrome y Safari ya lo hacen o están a punto de hacerlo.
Así que su lógica durante la fase de transición sería algo como esto:
detectar si el navegador es compatible con la API de archivos (que es fácil: if (typeof window.FileReader === 'function')
).
Si lo hace, genial, lea los datos localmente e insértelos en una imagen para encontrar las dimensiones.
De lo contrario, cargue el archivo en el servidor (probablemente envíe el formulario de un iframe para evitar abandonar la página) y luego pregunte qué tamaño tiene la imagen (o simplemente solicite la imagen cargada, si prefieres).
Editar he tenido la intención de abrir el ejemplo de la API de archivos por algún tiempo; aquí hay uno:
<!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>
Funciona muy bien en Firefox 3.6. Evité el uso de cualquier biblioteca allí, así que me disculpo por los manejadores de eventos de estilo de atributo (DOM0) y demás.
+1, esa es la manera de hacerlo. – YOU
¡Gracias por el ejemplo! – Pointy
Utilicé su solución para verificar la orientación de las imágenes antes de cargarlas a través de iOS Safari (ya que iOS elimina una gran cantidad de datos exif durante la carga, orientación, por ejemplo). Descubrí que tenía las dimensiones incorrectas si la imagen tenía pantalla: ninguna (confundía el ancho y el alto en el modo vertical). Mi manera de resolverlo fue darle una posición absoluta de -10000px más o menos. De cualquier manera, gracias por tu trabajo. Me salvó de muchos dolores de cabeza extra. – stafffan