Yüklemeden önce dosya boyutunu, resim genişliğini ve yüksekliğini alın


99

JQuery veya JavaScript ile web siteme yüklemeden önce dosya boyutunu, resim yüksekliğini ve genişliğini nasıl alabilirim?


2
bu bağlantı çok kullanışlıdır: developer.mozilla.org/en-US/docs/Web/API/FileReader/…
Stardust

1
Dosya adı, türü ve boyutunu alma konusunda adım adım öğretici codepedia.info/…
Satinder singh

Sorunuz için teşekkürler . Mamnoon
Mohammadali Mirhamed

Yanıtlar:


175

Bilgi verisi önizlemesiyle birden çok görüntü yüklenir

Kullanımı HTML5 ve Dosya API

URL API kullanma örneği

Görüntü kaynakları Blob nesnesini temsil eden bir URL olacaktır
<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>

FileReader API kullanan örnek

Uzun Base64 kodlu veri dizileri olarak görüntü kaynaklarına ihtiyacınız olması durumunda
<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 yalnızca yakın zamanda Dosya API'sini desteklemektedir. Bir göz atacağım
Roko C. Buljan

Reader.onload geri arama işlevinde i değeri uyarıldığında, rastgele bir artış gösterir! ör. 4 dosya için uyarı verilen değer 0 3 2 1 idi. Bunu kimse açıklayabilir mi?
freerunner

@freerunner dosyalarınız farklı boyuttadır, bu nedenle aynı anda yüklenmez.
Roko C. Buljan

Ne yazık ki bu, görüntünün iki kez yüklenmesini gerektiriyor. Genişliği ve yüksekliği dosya türü gibi dosya özellikleri olarak alsak çok daha iyi olur.
MrFox


8

JQuery doğrulama eklentisini kullanabiliyorsanız, bunu şu şekilde yapabilirsiniz:

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);
        }
});

İşlev, ab onload işlevi olarak aktarılır.

Kod buradan alınır


Bu 'dosyadaki' bu '[0] değerine sahip değildir. Bunun çalışması için element.files [0] olarak değiştirilmesi gerekir.
jetlej

Çoklu dosya seçimi için buna nasıl ulaşılır?
Shaik Nizamuddin

8

Demo

İstediğinizin bu olduğundan emin değilim, ancak basit bir örnek:

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

Burada, bir görüntü dosyası seçmenin, görüntülemenin, görüntü özelliklerinde döngü oluşturmanın ve ardından görüntüyü tuvalden bir IMG etiketine yeniden boyutlandırmanın ve yeniden boyutlandırılmış görüntü türünü açıkça jpeg olarak ayarlamanın saf bir JavaScript örneği verilmiştir.

Kanvas etiketinde en üstteki görüntüye sağ tıklarsanız ve Dosyayı Farklı Kaydet'i seçerseniz, varsayılan olarak PNG formatında olacaktır. Sağ tıklarsanız ve Dosyayı Kaydet'i alt resim olarak yaparsanız, varsayılan olarak JPEG formatına dönecektir. Genişliği 400 pikselin üzerindeki herhangi bir dosyanın genişliği 400 piksele ve orijinal dosyayla orantılı bir yüksekliğe indirgenir.

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>

SENARYO

<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>

İşte bir jsFiddle:

jsFiddle Bir görüntü dosyasını seçin, görüntüleyin, özellikleri alın ve yeniden boyutlandırın

JsFiddle'da, bir tuval olan üst görüntüye sağ tıklamak, size bir IMG etiketinde alt görüntüye sağ tıklamakla aynı kaydetme seçeneklerini vermez.


1

Bildiğim kadarıyla Javascript / JQuery'nin yerel dosya sistemine erişimi olmadığı için bunu yapmanın kolay bir yolu yok. Html 5'te dosya boyutu gibi belirli meta verileri kontrol etmenize izin veren bazı yeni özellikler var, ancak görüntü boyutlarını gerçekten alabileceğinizden emin değilim.

İşte html 5 özellikleriyle ilgili bulduğum bir makale ve IE için bir ActiveX denetimi kullanmayı içeren bir geçici çözüm. http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html


1

Bu yüzden FileReader API'nin sunduğu farklı şeyleri denemeye başladım ve bir DATA URL'si ile bir IMG etiketi oluşturabildim.

Dezavantaj: Cep telefonlarında çalışmıyor, ancak Google Chrome'da iyi çalışıyor.

$('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>

(bir jsfiddle bu bkz http://jsfiddle.net/eD2Ez/530/ )
(yani en için üzerine ilave orijinal jsfiddle bakınız http://jsfiddle.net/eD2Ez/ )


0

Çalışan bir jQuery doğrulama örneği:

   $(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));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.