Obtenga el tamaño del archivo, el ancho y la altura de la imagen antes de cargarlo


98

¿Cómo puedo obtener el tamaño del archivo, el alto y el ancho de la imagen antes de subirlo a mi sitio web, con jQuery o JavaScript?



1
Aquí un tutorial paso a paso para obtener el nombre, el tipo y el tamaño del archivo codepedia.info/…
Satinder singh

Gracias por su pregunta . Mamnoon
Mohammadali Mirhamed

Respuestas:


174

Carga de varias imágenes con vista previa de datos de información

Usando HTML5 y la API de archivos

Ejemplo usando URL API

Las fuentes de las imágenes serán una URL que represente el objeto Blob
<img src="blob:null/026cceb9-edr4-4281-babb-b56cbf759a3d">

const EL_browse  = document.getElementById('browse');
const EL_preview = document.getElementById('preview');

const readImage  = file => {
  if ( !(/^image\/(png|jpe?g|gif)$/).test(file.type) )
    return EL_preview.insertAdjacentHTML('beforeend', `Unsupported format ${file.type}: ${file.name}<br>`);

  const img = new Image();
  img.addEventListener('load', () => {
    EL_preview.appendChild(img);
    EL_preview.insertAdjacentHTML('beforeend', `<div>${file.name} ${img.width${img.height} ${file.type} ${Math.round(file.size/1024)}KB<div>`);
    window.URL.revokeObjectURL(img.src); // Free some memory
  });
  img.src = window.URL.createObjectURL(file);
}

EL_browse.addEventListener('change', ev => {
  EL_preview.innerHTML = ''; // Remove old images and data
  const files = ev.target.files;
  if (!files || !files[0]) return alert('File upload not supported');
  [...files].forEach( readImage );
});
#preview img { max-height: 100px; }
<input id="browse" type="file" multiple>
<div id="preview"></div>

Ejemplo usando FileReader API

En caso de que necesite fuentes de imágenes como cadenas de datos codificadas en Base64 largas
<img src="data:image/png;base64,iVBORw0KGg... ...lF/++TkSuQmCC=">

const EL_browse  = document.getElementById('browse');
const EL_preview = document.getElementById('preview');

const readImage = file => {
  if ( !(/^image\/(png|jpe?g|gif)$/).test(file.type) )
    return EL_preview.insertAdjacentHTML('beforeend', `<div>Unsupported format ${file.type}: ${file.name}</div>`);

  const reader = new FileReader();
  reader.addEventListener('load', () => {
    const img  = new Image();
    img.addEventListener('load', () => {
      EL_preview.appendChild(img);
      EL_preview.insertAdjacentHTML('beforeend', `<div>${file.name} ${img.width${img.height} ${file.type} ${Math.round(file.size/1024)}KB</div>`);
    });
    img.src = reader.result;
  });
  reader.readAsDataURL(file);  
};

EL_browse.addEventListener('change', ev => {
  EL_preview.innerHTML = ''; // Clear Preview
  const files = ev.target.files;
  if (!files || !files[0]) return alert('File upload not supported');
  [...files].forEach( readImage );
});
#preview img { max-height: 100px; }
<input id="browse" type="file"  multiple>
<div id="preview"></div>
  


1
@SMC caniuse.com/fileapi solo admite recientemente File API. Echaré un vistazo
Roko C. Buljan

cuando se alerta el valor de i en la función de devolución de llamada reader.onload, muestra un incremento aleatorio. por ejemplo, para 4 archivos, el valor alertado fue 0 3 2 1. ¿Alguien puede explicar eso?
Freerunner

@freerunner sus archivos son de diferente tamaño, por lo tanto, no se cargan al mismo tiempo.
Roko C. Buljan

Lamentablemente, esto requiere cargar la imagen dos veces. Sería mucho mejor si pudiéramos obtener el ancho y el alto como propiedades de archivo como el tipo de archivo.
MrFox


8

Si puede usar el complemento de validación jQuery, puede hacerlo así:

HTML:

<input type="file" name="photo" id="photoInput" />

JavaScript:

$.validator.addMethod('imagedim', function(value, element, param) {
  var _URL = window.URL;
        var  img;
        if ((element = this.files[0])) {
            img = new Image();
            img.onload = function () {
                console.log("Width:" + this.width + "   Height: " + this.height);//this will give you image width and height and you can easily validate here....

                return this.width >= param
            };
            img.src = _URL.createObjectURL(element);
        }
});

La función se pasa como función ab onload.

El código se toma de aquí


'this' en this'files [0] no tiene valor. Esto debe cambiarse a element.files [0] para que funcione.
jetlej

¿Cómo lograr esto para la selección de múltiples archivos?
Shaik Nizamuddin

7

Manifestación

No estoy seguro de si es lo que quiere, pero solo un ejemplo simple:

var input = document.getElementById('input');

input.addEventListener("change", function() {
    var file  = this.files[0];
    var img = new Image();

    img.onload = function() {
        var sizes = {
            width:this.width,
            height: this.height
        };
        URL.revokeObjectURL(this.src);

        console.log('onload: sizes', sizes);
        console.log('onload: this', this);
    }

    var objectURL = URL.createObjectURL(file);

    console.log('change: file', file);
    console.log('change: objectURL', objectURL);
    img.src = objectURL;
});

3

Aquí hay un ejemplo de JavaScript puro de cómo seleccionar un archivo de imagen, mostrarlo, recorrer las propiedades de la imagen y luego cambiar el tamaño de la imagen del lienzo en una etiqueta IMG y establecer explícitamente el tipo de imagen redimensionada en jpeg.

Si hace clic con el botón derecho en la imagen superior, en la etiqueta del lienzo, y elige Guardar archivo como, tendrá un formato PNG predeterminado. Si hace clic con el botón derecho y Guardar archivo como la imagen inferior, el formato predeterminado será JPEG. Cualquier archivo de más de 400 px de ancho se reduce a 400 px de ancho y una altura proporcional al archivo original.

HTML

<form class='frmUpload'>
  <input name="picOneUpload" type="file" accept="image/*" onchange="picUpload(this.files[0])" >
</form>

<canvas id="cnvsForFormat" width="400" height="266" style="border:1px solid #c3c3c3"></canvas>
<div id='allImgProperties' style="display:inline"></div>

<div id='imgTwoForJPG'></div>

GUIÓN

<script>

window.picUpload = function(frmData) {
  console.log("picUpload ran: " + frmData);

var allObjtProperties = '';
for (objProprty in frmData) {
    console.log(objProprty + " : " + frmData[objProprty]);
    allObjtProperties = allObjtProperties + "<span>" + objProprty + ": " + frmData[objProprty] + ", </span>";
};

document.getElementById('allImgProperties').innerHTML = allObjtProperties;

var cnvs=document.getElementById("cnvsForFormat");
console.log("cnvs: " + cnvs);
var ctx=cnvs.getContext("2d");

var img = new Image;
img.src = URL.createObjectURL(frmData);

console.log('img: ' + img);

img.onload = function() {
  var picWidth = this.width;
  var picHeight = this.height;

  var wdthHghtRatio = picHeight/picWidth;
  console.log('wdthHghtRatio: ' + wdthHghtRatio);

  if (Number(picWidth) > 400) {
    var newHeight = Math.round(Number(400) * wdthHghtRatio);
  } else {
    return false;
  };

    document.getElementById('cnvsForFormat').height = newHeight;
    console.log('width: 400  h: ' + newHeight);
    //You must change the width and height settings in order to decrease the image size, but
    //it needs to be proportional to the original dimensions.
    console.log('This is BEFORE the DRAW IMAGE');
    ctx.drawImage(img,0,0, 400, newHeight);

    console.log('THIS IS AFTER THE DRAW IMAGE!');

    //Even if original image is jpeg, getting data out of the canvas will default to png if not specified
    var canvasToDtaUrl = cnvs.toDataURL("image/jpeg");
    //The type and size of the image in this new IMG tag will be JPEG, and possibly much smaller in size
    document.getElementById('imgTwoForJPG').innerHTML = "<img src='" + canvasToDtaUrl + "'>";
};
};

</script>

Aquí hay un jsFiddle:

jsFiddle Elija, muestre, obtenga propiedades y cambie el tamaño de un archivo de imagen

En jsFiddle, hacer clic derecho en la imagen superior, que es un lienzo, no le dará las mismas opciones de guardado que hacer clic derecho en la imagen inferior en una etiqueta IMG.


1

Hasta donde yo sé, no hay una manera fácil de hacer esto ya que Javascript / JQuery no tiene acceso al sistema de archivos local. Hay algunas características nuevas en html 5 que le permiten verificar ciertos metadatos, como el tamaño del archivo, pero no estoy seguro de si realmente puede obtener las dimensiones de la imagen.

Aquí hay un artículo que encontré sobre las características de html 5 y una solución para IE que implica el uso de un control ActiveX. http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html


1

Entonces comencé a experimentar con las diferentes cosas que la API de FileReader tenía para ofrecer y pude crear una etiqueta IMG con una URL de DATOS.

Inconveniente: no funciona en teléfonos móviles, pero funciona bien en Google Chrome.

$('input').change(function() {
    
    var fr = new FileReader;
    
    fr.onload = function() {
        var img = new Image;
        
        img.onload = function() { 
//I loaded the image and have complete control over all attributes, like width and src, which is the purpose of filereader.
            $.ajax({url: img.src, async: false, success: function(result){
            		$("#result").html("READING IMAGE, PLEASE WAIT...")
            		$("#result").html("<img src='" + img.src + "' />");
                console.log("Finished reading Image");
        		}});
        };
        
        img.src = fr.result;
    };
    
    fr.readAsDataURL(this.files[0]);
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" accept="image/*" capture="camera">
<div id='result'>Please choose a file to view it. <br/>(Tested successfully on Chrome - 100% SUCCESS RATE)</div>

(vea esto en un jsfiddle en http://jsfiddle.net/eD2Ez/530/ )
(vea el jsfiddle original que agregué en http://jsfiddle.net/eD2Ez/ )


0

Un ejemplo funcional de validación de jQuery:

   $(function () {
        $('input[type=file]').on('change', function() {
            var $el = $(this);
            var files = this.files;
            var image = new Image();
            image.onload = function() {
                $el
                    .attr('data-upload-width', this.naturalWidth)
                    .attr('data-upload-height', this.naturalHeight);
            }

            image.src = URL.createObjectURL(files[0]);
        });

        jQuery.validator.unobtrusive.adapters.add('imageminwidth', ['imageminwidth'], function (options) {
            var params = {
                imageminwidth: options.params.imageminwidth.split(',')
            };

            options.rules['imageminwidth'] = params;
            if (options.message) {
                options.messages['imageminwidth'] = options.message;
            }
        });

        jQuery.validator.addMethod("imageminwidth", function (value, element, param) {
            var $el = $(element);
            if(!element.files && element.files[0]) return true;
            return parseInt($el.attr('data-upload-width')) >=  parseInt(param["imageminwidth"][0]);
        });

    } (jQuery));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.