176 votes

Vérifier la largeur et la hauteur de l'image avant de la télécharger avec Javascript

J'ai un JPS avec un formulaire dans lequel un utilisateur peut mettre une image :

<div class="photo">
    <div>Photo (max 240x240 and 100 kb):</div>
    <input type="file" name="photo" id="photoInput" onchange="checkPhoto(this)"/>
</div>

J'ai écrit ces js :

function checkPhoto(target) {
    if(target.files[0].type.indexOf("image") == -1) {
        document.getElementById("photoLabel").innerHTML = "File not supported";
        return false;
    }
    if(target.files[0].size > 102400) {
        document.getElementById("photoLabel").innerHTML = "Image too big (max 100kb)";
        return false;
    }
    document.getElementById("photoLabel").innerHTML = "";
    return true;
}

qui fonctionne bien pour vérifier le type et la taille du fichier. Maintenant, je veux vérifier la largeur et la hauteur de l'image mais je ne peux pas le faire.
J'ai essayé avec target.files[0].width mais je reçois undefined . Avec d'autres moyens, j'obtiens 0 .
Des suggestions ?

266voto

Esailija Points 74052

Le fichier est juste un fichier, vous devez créer une image comme ceci :

var _URL = window.URL || window.webkitURL;
$("#file").change(function (e) {
    var file, img;
    if ((file = this.files[0])) {
        img = new Image();
        var objectUrl = _URL.createObjectURL(file);
        img.onload = function () {
            alert(this.width + " " + this.height);
            _URL.revokeObjectURL(objectUrl);
        };
        img.src = objectUrl;
    }
});

Démonstration : http://jsfiddle.net/4N6D9/1/

Je suppose que vous réalisez que cela n'est supporté que par quelques navigateurs. Principalement Firefox et Chrome, peut-être Opera aussi maintenant.

P.S. Le site URL.createObjectURL() a été supprimée de la méthode MediaStream interface . Cette méthode a été dépréciée en 2013 et remplacée par l'attribution des flux à HTMLMediaElement.srcObject . L'ancienne méthode a été supprimée parce qu'elle est moins sûre, puisqu'elle nécessite un appel à la fonction URL.revokeOjbectURL() pour terminer le flux. D'autres agents utilisateurs ont soit déprécié (Firefox) soit supprimé (Safari) cette fonctionnalité.

Pour plus d'informations, veuillez consulter aquí .

62voto

ash das Points 521

À mon avis, la réponse parfaite que vous devez exiger est la suivante

var reader = new FileReader();

//Read the contents of Image File.
reader.readAsDataURL(fileUpload.files[0]);
reader.onload = function (e) {

  //Initiate the JavaScript Image object.
  var image = new Image();

  //Set the Base64 string return from FileReader as source.
  image.src = e.target.result;

  //Validate the File Height and Width.
  image.onload = function () {
    var height = this.height;
    var width = this.width;
    if (height > 100 || width > 100) {
      alert("Height and Width must not exceed 100px.");
      return false;
    }
    alert("Uploaded image has valid Height and Width.");
    return true;
  };
};

0 votes

Une bonne réponse, puisqu'elle ne nécessite pas createObjectUrl . Peut être amélioré pour être utilisé reader.result au lieu de e.target.result et devrait utiliser reader.onloadend au lieu de onload combiné avec reader.onerror pour gérer les erreurs

0 votes

J'ai essayé le code avec un fichier image de 13 MB. Il faut jusqu'à 2 secondes au navigateur pour traiter et renvoyer la largeur et la hauteur. La première réponse, en revanche, obtient les dimensions de l'image en quelques millisecondes.

0 votes

@Avatar vous devriez indiquer qui a posté la meilleure réponse, puisque la meilleure réponse change au fil du temps.

32voto

pseudosavant Points 2184

Je suis d'accord. Une fois que l'image est téléchargée à un endroit auquel le navigateur de l'utilisateur peut accéder, il est assez facile d'obtenir la taille. Comme vous devez attendre que l'image se charge, vous devez vous connecter à l'interface de l'utilisateur. onload événement pour img .

Exemple actualisé :

// async/promise function for retrieving image dimensions for a URL
function imageSize(url) {
    const img = document.createElement("img");

    const promise = new Promise((resolve, reject) => {
      img.onload = () => {
        // Natural size is the actual image size regardless of rendering.
        // The 'normal' `width`/`height` are for the **rendered** size.
        const width  = img.naturalWidth;
        const height = img.naturalHeight; 

        // Resolve promise with the width and height
        resolve({width, height});
      };

      // Reject promise on error
      img.onerror = reject;
    });

    // Setting the source makes it start downloading and eventually call `onload`
    img.src = url;

    return promise;
}

// How to use in an async function
(async() => {
  const imageUrl = 'http://your.website.com/userUploadedImage.jpg';
  const imageDimensions = await imageSize(imageUrl);

  console.info(imageDimensions); // {width: 1337, height: 42}
})();

Un exemple plus ancien :

var width, height;

var img = document.createElement("img");
img.onload = function() {
    // `naturalWidth`/`naturalHeight` aren't supported on <IE9. Fallback to normal width/height
    // The natural size is the actual image size regardless of rendering.
    // The 'normal' width/height are for the **rendered** size.

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

    // Do something with the width and height
}

// Setting the source makes it start downloading and eventually call `onload`
img.src = "http://your.website.com/userUploadedImage.jpg";

25voto

Eric Wallen Points 361

C'est le moyen le plus simple de vérifier la taille.

let img = new Image()
img.src = window.URL.createObjectURL(event.target.files[0])
img.onload = () => {
   alert(img.width + " " + img.height);
}

Vérifiez la taille spécifique. En utilisant 100 x 100 comme exemple

let img = new Image()
img.src = window.URL.createObjectURL(event.target.files[0])
img.onload = () => {
   if(img.width === 100 && img.height === 100){
        alert(`Nice, image is the right size. It can be uploaded`)
        // upload logic here
        } else {
        alert(`Sorry, this image doesn't look like the size we wanted. It's 
   ${img.width} x ${img.height} but we require 100 x 100 size image.`);
   }                
}

5voto

Ir Calif Points 428

Attachez la fonction à la méthode onchange du fichier de type d'entrée / onchange="validateimg(this)" /

   function validateimg(ctrl) { 
        var fileUpload = ctrl;
        var regex = new RegExp("([a-zA-Z0-9\s_\\.\-:])+(.jpg|.png|.gif)$");
        if (regex.test(fileUpload.value.toLowerCase())) {
            if (typeof (fileUpload.files) != "undefined") {
                var reader = new FileReader();
                reader.readAsDataURL(fileUpload.files[0]);
                reader.onload = function (e) {
                    var image = new Image();
                    image.src = e.target.result;
                    image.onload = function () {
                        var height = this.height;
                        var width = this.width;
                        if (height < 1100 || width < 750) {
                            alert("At least you can upload a 1100*750 photo size.");
                            return false;
                        }else{
                            alert("Uploaded image has valid Height and Width.");
                            return true;
                        }
                    };
                }
            } else {
                alert("This browser does not support HTML5.");
                return false;
            }
        } else {
            alert("Please select a valid Image file.");
            return false;
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X