วิธีรับขนาดภาพ (ความสูงและความกว้าง) โดยใช้ JavaScript


คำตอบ:


792

คุณสามารถรับภาพโดยทางโปรแกรมและตรวจสอบขนาดโดยใช้ Javascript ...

var img = new Image();
img.onload = function() {
  alert(this.width + 'x' + this.height);
}
img.src = 'http://www.google.com/intl/en_ALL/images/logo.gif';

สิ่งนี้มีประโยชน์หากภาพไม่ได้เป็นส่วนหนึ่งของมาร์กอัป


4
@ blo0p3r - รูปภาพไม่จำเป็นต้องโหลดเข้าสู่ DOM ก่อนหน้านี้ มันโหลดภาพและยิง onload เพื่อให้มิติกับเรา โดยวิธีการ - คำตอบที่ดีที่สุดที่นี่ !!
Vik

ฉันหวังว่าคุณสามารถทำได้ด้วยวัตถุ XMLHttpRequest เช่นกัน
PHearst

ฉันจะใช้รหัสนี้สำหรับภาพหลาย ๆ ภาพ (หลายแถว) ได้อย่างไร? อาจจะต้องรวมกับคำตอบที่ดีที่สุดจากที่นี่: stackoverflow.com/questions/4288759/… ?
Kozuch

โซลูชันสำหรับภาพหลายภาพได้ที่นี่: stackoverflow.com/questions/19269834/…
Kozuch

2
img.onerror = function () {alert (0); // ไม่พบตัวจัดการ}
isa ไร้ขีด จำกัด

437

clientWidthและclientHeightเป็นคุณสมบัติ DOM ที่แสดงขนาดในเบราว์เซอร์ปัจจุบันของมิติด้านในขององค์ประกอบ DOM (ไม่รวมระยะขอบและเส้นขอบ) ดังนั้นในกรณีขององค์ประกอบ IMG สิ่งนี้จะได้ขนาดที่แท้จริงของภาพที่มองเห็นได้

var img = document.getElementById('imageid'); 
//or however you get a handle to the IMG
var width = img.clientWidth;
var height = img.clientHeight;

33
@ Nicky ถูกต้องแล้ว มันให้มิติของภาพตามที่แสดงในอินสแตนซ์นั้น
Rex M

8
@ จ้าภาพและ$.fn.width $.fn.height
yckart

202
คำตอบที่ถูกต้องคือใช้ img.naturalWidth และ img.naturalHeight
Octopus

5
document.getElementByIdมีความยาวในการพิมพ์ แต่ 10 $('#...')[0]ครั้งเร็วกว่า
bfontaine

17
@RexM สำหรับ Chrome 35 มันเร็วกว่า 16 เท่า: jsperf.com/document-getelementbyid-vs-jquery/5
bfontaine

335

นอกจากนี้ (นอกเหนือจากคำตอบของ Rex และ Ian) ยังมี:

imageElement.naturalHeight

และ

imageElement.naturalWidth

สิ่งเหล่านี้ให้ความสูงและความกว้างของไฟล์ภาพเอง (แทนที่จะเป็นเพียงองค์ประกอบภาพ)


15
ตอนนี้ได้รับการสนับสนุนใน IE9 และเว็บเบราว์เซอร์ที่ทันสมัยทั้งหมด
แอรอน

รับ 0x0 เมื่อภาพยังโหลดไม่เสร็จ
brk

1
ฉันใช้โครเมียมและใช้งานได้ก็ต่อเมื่อขนาดภาพใน dom ไม่เปลี่ยนแปลงเมื่อโหลดหน้าเว็บแล้ว
Jonathan Czitkovics

ใช่ ... นี่คือสิ่งที่ฉันทำ จากนั้นหลังจากนั้นถ้า "ความกว้างของธรรมชาติ" หรือความสูงกลับมาเป็น NaNs ฉันจะเปลี่ยนกลับไปเป็นวิธีอื่นจากคำตอบก่อนหน้า (รับภาพอีกครั้งเป็นรูปภาพใหม่ () แล้วรับความกว้างและความสูงระหว่างเหตุการณ์ onload ช้าลง แต่ด้วยวิธีนี้มันจะทำงานในเบราว์เซอร์รุ่นเก่าเช่น IE8
แรนดี้

ในกรณีที่คุณต้องการทราบเกี่ยวกับการสนับสนุนเบราว์เซอร์caniuse.com/#feat=img-naturalwidth-naturalheight
ulmer-morozov

109

หากคุณใช้ jQuery และคุณกำลังขอขนาดภาพคุณต้องรอจนกว่าจะโหลดหรือคุณจะได้รับเลขศูนย์

$(document).ready(function() {
    $("img").load(function() {
        alert($(this).height());
        alert($(this).width());
    });
});

ความกว้างและความสูงมีอยู่ในตัวจัดการโหลดเสมอหรือไม่
Anders Lindén

@ AndersLindén - ดู thel ink ที่ Akseli เพิ่มไว้สำหรับเหตุการณ์โหลด มีส่วนเฉพาะที่อุทิศให้กับภาพ คำตอบทางเทคนิคคือ "ไม่" แต่ในทางปฏิบัติฉันไม่เคยมีปัญหากับเว็บไซต์ของเราที่ใช้วิธีนี้
mrtsherman

แต่ถ้าไม่มีคำตอบทางเทคนิคมันใช้ไม่ได้เหรอ? ไม่ใช่เหรอ
Anders Lindén

เป็นไปได้ไหมที่จะรับคุณลักษณะของภาพก่อนที่จะโหลด?
ไม่มี

98

ฉันคิดว่าการอัปเดตคำตอบเหล่านี้มีประโยชน์เพราะหนึ่งในคำตอบที่ได้รับการโหวตอย่างดีที่สุดแนะนำให้ใช้clientWidthและลูกค้าความสูงซึ่งตอนนี้ฉันคิดว่าล้าสมัยแล้ว

ฉันได้ทำการทดลองกับ HTML5 เพื่อดูว่าค่าใดได้รับคืนจริง

ก่อนอื่นฉันใช้โปรแกรมชื่อ Dash เพื่อดูภาพรวมของ API รูปภาพ มันระบุว่าheightและwidthมีการแสดงผลความสูง / ความกว้างของภาพและที่naturalHeightและnaturalWidthมีความสูงที่แท้จริง / ความกว้างของภาพ (และเป็น HTML5 เท่านั้น)

ฉันใช้รูปผีเสื้อที่สวยงามจากไฟล์ที่มีความสูง 300 และกว้าง 400 และ Javascript นี้:

var img = document.getElementById("img1");

console.log(img.height,           img.width);
console.log(img.naturalHeight,    img.naturalWidth);
console.log($("#img1").height(),  $("#img1").width());

จากนั้นฉันใช้ HTML นี้พร้อม CSS แบบอินไลน์สำหรับความสูงและความกว้าง

<img style="height:120px;width:150px;" id="img1" src="img/Butterfly.jpg" />

ผล:

/*Image Element*/ height == 300         width == 400
           naturalHeight == 300  naturalWidth == 400
/*Jquery*/      height() == 120       width() == 150

/*Actual Rendered size*/    120                  150

ฉันเปลี่ยน HTML เป็นดังต่อไปนี้:

<img height="90" width="115" id="img1" src="img/Butterfly.jpg" />

เช่นการใช้แอตทริบิวต์ความสูงและความกว้างมากกว่ารูปแบบอินไลน์

ผล:

/*Image Element*/ height ==  90         width == 115
           naturalHeight == 300  naturalWidth == 400
/*Jquery*/      height() ==  90       width() == 115

/*Actual Rendered size*/     90                  115

ฉันเปลี่ยน HTML เป็นดังต่อไปนี้:

<img height="90" width="115" style="height:120px;width:150px;" id="img1" src="img/Butterfly.jpg" />

คือการใช้ทั้งคุณสมบัติและ CSS เพื่อดูว่าจะมีความสำคัญ

ผล:

/*Image Element*/ height ==  90         width == 115
           naturalHeight == 300  naturalWidth == 400
/*Jquery*/      height() == 120       width() == 150

/*Actual Rendered size*/    120                  150

1
ทำไมคุณถึงคิดว่าลูกค้าความสูงล้าสมัย?
Cactux

64

ใช้ JQuery คุณทำสิ่งนี้:

var imgWidth = $("#imgIDWhatever").width();

63
และถ้าภาพยังไม่โหลด?
James Westgate

11
และถ้าภาพอยู่ในคุณสมบัติพื้นหลังของ div? :)
NDM

3
@JamesWestgate หากยังไม่ได้โหลดรูปภาพจะไม่มีวิธีกำหนดขนาดจริง อย่างไรก็ตามคุณสามารถลองอ่านwidthและheightคุณลักษณะของimgองค์ประกอบได้
ทิม

@Tim คุณสามารถโหลดมันในพื้นหลังและเมื่อโหลดคุณสามารถมีขนาดได้
Odys

26

สิ่งอื่น ๆ ที่ลืมคือคุณไม่สามารถตรวจสอบขนาดภาพก่อนที่จะโหลด เมื่อผู้เขียนตรวจสอบวิธีการโพสต์ทั้งหมดมันจะทำงานบน localhost เท่านั้น เนื่องจากสามารถใช้ jQuery ได้ที่นี่โปรดจำไว้ว่าเหตุการณ์ 'พร้อม' ถูกยิงก่อนที่จะโหลดรูปภาพ $ ('# xxx'). width () และ .height () ควรเปิดใช้งานในเหตุการณ์ onload หรือใหม่กว่า


9
โพสต์โค้ดที่อัพเดทบางอันคุณอาจได้รับการ upvoted และแม้แต่รับตราการกลับรายการโลภ!
James Westgate

1
@ นักคิดกรุณาให้ทางออกของคุณเพราะการวิเคราะห์ของคุณดูเหมือนถูกต้อง
a20

5
นี่ไม่ใช่คำตอบ เพียงแสดงความคิดเห็นเกี่ยวกับคำตอบอื่น ๆ
jeffdill2

20

คุณสามารถทำได้โดยใช้การเรียกกลับของเหตุการณ์โหลดเนื่องจากไม่ทราบขนาดของภาพจนกว่าจะเสร็จสิ้นการโหลดจริง บางอย่างเช่นรหัสด้านล่าง ...

var imgTesting = new Image();

function CreateDelegate(contextObject, delegateMethod)
{
    return function()
    {
        return delegateMethod.apply(contextObject, arguments);
    }
}

function imgTesting_onload()
{
    alert(this.width + " by " + this.height);
}


imgTesting.onload = CreateDelegate(imgTesting, imgTesting_onload);
imgTesting.src = 'yourimage.jpg';

1
ใน jquery คุณสามารถใช้ $ .proxy สำหรับสิ่งนี้
Jochem Van Der Spek

9

ด้วยjQuery library-

การใช้งานและ.width().height()

เพิ่มเติมในความกว้าง jQueryและ jQuery heigth

ตัวอย่างรหัส -

$(document).ready(function(){
    $("button").click(function()
    {
        alert("Width of image: " + $("#img_exmpl").width());
        alert("Height of image: " + $("#img_exmpl").height());
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>

<img id="img_exmpl" src="http://images.all-free-download.com/images/graphicthumb/beauty_of_nature_9_210287.jpg">
<button>Display dimensions of img</button>


8

โอเคฉันคิดว่าฉันปรับปรุงซอร์สโค้ดเพื่อให้สามารถโหลดรูปภาพก่อนที่จะพยายามค้นหาคุณสมบัติของมันมิฉะนั้นจะแสดง '0 * 0' เนื่องจากคำสั่งถัดไปจะถูกเรียกก่อนที่จะโหลดไฟล์ลงใน เบราว์เซอร์ ต้อง jquery ...

function getImgSize(imgSrc){
    var newImg = new Image();
    newImg.src = imgSrc;
    var height = newImg.height;
    var width = newImg.width;
    p = $(newImg).ready(function(){
        return {width: newImg.width, height: newImg.height};
    });
    alert (p[0]['width']+" "+p[0]['height']);
}

8

สมมติว่าเราต้องการได้ขนาดภาพของ <img id="an-img" src"...">

// Query after all the elements on the page have loaded.
// Or, use `onload` on a particular element to check if it is loaded.
document.addEventListener('DOMContentLoaded', function () {
  var el = document.getElementById("an-img");

  console.log({
    "naturalWidth": el.naturalWidth, // Only on HTMLImageElement
    "naturalHeight": el.naturalHeight, // Only on HTMLImageElement
    "offsetWidth": el.offsetWidth,
    "offsetHeight": el.offsetHeight
  });

มิติธรรมชาติ

el.naturalWidthและel.naturalHeightจะทำให้เรามีมิติตามธรรมชาติขนาดของไฟล์ภาพ

เค้าโครงขนาด

el.offsetWidthและel.offsetHeightจะทำให้เรามีมิติที่องค์ประกอบจะถูกแสดงในเอกสาร


4
เพียงโหวตคำตอบปัจจุบันที่มีเนื้อหาที่เป็นประโยชน์ อย่าคัดลอกจากหลายรายการลงในใหม่ คุณแค่ทำซ้ำเนื้อหาแล้ว
TylerH

7

ก่อนใช้ขนาดภาพจริงคุณควรโหลดภาพต้นฉบับ หากคุณใช้กรอบงาน JQuery คุณจะได้ขนาดภาพที่แท้จริงได้ง่ายๆ

$("ImageID").load(function(){
  console.log($(this).width() + "x" + $(this).height())
})

7

คำตอบนี้เป็นสิ่งที่ฉันกำลังมองหา (ใน jQuery):

var imageNaturalWidth = $('image-selector').prop('naturalWidth');
var imageNaturalHeight = $('image-selector').prop('naturalHeight');

5

คุณสามารถมีฟังก์ชั่นที่ง่ายเช่นต่อไปนี้ ( imageDimensions()) ถ้าคุณไม่กลัวใช้สัญญา

// helper to get dimensions of an image
const imageDimensions = file => new Promise((resolve, reject) => {
    const img = new Image()

    // the following handler will fire after the successful parsing of the image
    img.onload = () => {
        const { naturalWidth: width, naturalHeight: height } = img
        resolve({ width, height })
    }

    // and this handler will fire if there was an error with the image (like if it's not really an image or a corrupted one)
    img.onerror = () => {
        reject('There was some problem with the image.')
    }
    
    img.src = URL.createObjectURL(file)
})

// here's how to use the helper
const getInfo = async ({ target: { files } }) => {
    const [file] = files
 
    try {
        const dimensions = await imageDimensions(file)
        console.info(dimensions)
    } catch(error) {
        console.error(error)
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.0.0-beta.3/babel.min.js"></script>

Select an image:
<input
  type="file"
  onchange="getInfo(event)"
/>
<br />
<small>It works offline.</small>



3

คิดว่านี่อาจเป็นประโยชน์กับบางคนที่ใช้ Javascript และ / หรือ Typescript ในปี 2019

ฉันพบสิ่งต่อไปนี้ตามที่บางคนแนะนำว่าไม่ถูกต้อง:

let img = new Image();
img.onload = function() {
  console.log(this.width, this.height) // Error: undefined is not an object
};
img.src = "http://example.com/myimage.jpg";

สิ่งนี้ถูกต้อง:

let img = new Image();
img.onload = function() {
  console.log(img.width, img.height)
};
img.src = "http://example.com/myimage.jpg";

สรุป:

ใช้imgไม่ได้thisในonloadฟังก์ชั่น


img.src ด้านบนมีการพิมพ์ผิดควรเป็น "ไม่: ฉันพยายามแก้ไข แต่ไม่สามารถทำได้เพราะ:" การแก้ไขต้องมีอย่างน้อย 6 ตัวอักษร มีอย่างอื่นที่ต้องปรับปรุงในโพสต์นี้หรือไม่ "มิฉะนั้นเป็นทางออกที่ง่ายมากที่ทำงานได้อย่างสมบูรณ์
user2677034

ขอบคุณ @ user2677034 สำหรับการสังเกต ฉันไม่เห็นสิ่งนั้น ฉันจะโทษแป้นพิมพ์ของ Apple แค่ล้อเล่น ... มันอาจเป็นความผิดของฉัน ; P
Brian

2

เมื่อเร็ว ๆ นี้ฉันมีปัญหาเดียวกันสำหรับข้อผิดพลาดในแถบเลื่อนเฟล็กซ์ ความสูงของภาพแรกถูกตั้งค่าให้เล็กลงเนื่องจากความล่าช้าในการโหลด ฉันลองวิธีต่อไปนี้เพื่อแก้ไขปัญหาดังกล่าวและใช้งานได้

// create image with a reference id. Id shall be used for removing it from the dom later.
var tempImg = $('<img id="testImage" />');
//If you want to get the height with respect to any specific width you set.
//I used window width here.
tempImg.css('width', window.innerWidth);  
tempImg[0].onload = function () {
    $(this).css('height', 'auto').css('display', 'none');
    var imgHeight = $(this).height();
    // Remove it if you don't want this image anymore.
    $('#testImage').remove();
}
//append to body
$('body').append(tempImg);
//Set an image url. I am using an image which I got from google.
tempImg[0].src ='http://aspo.org/wp-content/uploads/strips.jpg';

สิ่งนี้จะให้ความสูงกับความกว้างที่คุณตั้งไว้มากกว่าความกว้างดั้งเดิมหรือศูนย์



1

Nicky De Maeyer ถามภาพพื้นหลัง ฉันเพิ่งได้รับจาก css และแทนที่ "url ()":

var div = $('#my-bg-div');
var url = div.css('background-image').replace(/^url\(\'?(.*)\'?\)$/, '$1');
var img = new Image();
img.src = url;
console.log('img:', img.width + 'x' + img.height); // zero, image not yet loaded
console.log('div:', div.width() + 'x' + div.height());
img.onload = function() {
  console.log('img:', img.width + 'x' + img.height, (img.width/div.width()));
}

ฉันไม่เคยเข้าใจการใช้ regexp เมื่อใช้ jQuery เนื่องจาก jQuery จะทำให้คุณลักษณะปกติสำหรับคุณหายไปโดยใช้s.substr(4,s.length-5)มันอย่างน้อยก็ง่ายต่อสายตา;)
Jonas Schubert Erlandsson

1

คุณสามารถใช้คุณสมบัติตัวจัดการ onload เมื่อหน้าโหลด js หรือ jquery เช่นนี้: -

$(document).ready(function(){
   var width = img.clientWidth;
   var height = img.clientHeight;

 });

1

ง่ายๆคุณสามารถทดสอบเช่นนี้

  <script>
  (function($) {
        $(document).ready(function() {
            console.log("ready....");
            var i = 0;
            var img;
            for(i=1; i<13; i++) {
                img = new Image();
                img.src = 'img/' + i + '.jpg';
                console.log("name : " + img.src);
                img.onload = function() {
                    if(this.height > this.width) {
                        console.log(this.src + " : portrait");
                    }
                    else if(this.width > this.height) {
                        console.log(this.src + " : landscape");
                    }
                    else {
                        console.log(this.src + " : square");
                    }
                }
            }
        });
    }(jQuery));
  </script>

0
var img = document.getElementById("img_id");
alert( img.height + " ;; " + img .width + " ;; " + img .naturalHeight + " ;; " + img .clientHeight + " ;; " + img.offsetHeight + " ;; " + img.scrollHeight + " ;; " + img.clientWidth + " ;; " + img.offsetWidth + " ;; " + img.scrollWidth )
//But all invalid in Baidu browser  360 browser ...

0

มันเป็นสิ่งสำคัญที่จะลบการตั้งค่าเบราว์เซอร์ตีความจาก div ผู้ปกครอง ดังนั้นหากคุณต้องการความกว้างและความสูงของภาพที่แท้จริงคุณก็สามารถใช้

$('.right-sidebar').find('img').each(function(){
    $(this).removeAttr("width");
    $(this).removeAttr("height");
    $(this).imageResize();
});

นี่เป็นตัวอย่างหนึ่งของโครงการ TYPO3 จากฉันที่ฉันต้องการคุณสมบัติที่แท้จริงของภาพเพื่อปรับขนาดด้วยความสัมพันธ์ที่ถูกต้อง


0
var imgSrc, imgW, imgH;
function myFunction(image){
    var img = new Image();
    img.src = image;
    img.onload = function() {   
        return {
            src:image,
            width:this.width,
            height:this.height};
        }
    return img;
}
var x = myFunction('http://www.google.com/intl/en_ALL/images/logo.gif');
    //Waiting for the image loaded. Otherwise, system returned 0 as both width and height.
x.addEventListener('load',function(){
    imgSrc = x.src;
    imgW = x.width;
    imgH = x.height;
});
x.addEventListener('load',function(){
    console.log(imgW+'x'+imgH);//276x110
});
console.log(imgW);//undefined.
console.log(imgH);//undefined.
console.log(imgSrc);//undefined.

นี่คือวิธีการของฉันหวังว่าจะเป็นประโยชน์ :)


0
function outmeInside() {
var output = document.getElementById('preview_product_image');

 if (this.height < 600 || this.width < 600) {
     output.src = "http://localhost/danieladenew/uploads/no-photo.jpg";
     alert("The image you have selected is low resloution image.Your image width=" + this.width + ",Heigh=" + this.height + ". Please select image greater or equal to 600x600,Thanks!");
 } else {
     output.src = URL.createObjectURL(event.target.files[0]);

 }
 return;

 }

 img.src = URL.createObjectURL(event.target.files[0]);
}

ใช้งานได้กับภาพตัวอย่างหลายภาพและอัปโหลด หากคุณต้องเลือกภาพแต่ละภาพทีละภาพ จากนั้นคัดลอกและวางลงในฟังก์ชั่นภาพตัวอย่างทั้งหมดและตรวจสอบ !!!


0

ก่อนที่จะได้รับคุณลักษณะขององค์ประกอบหน้าเอกสารควรเป็น onload:

window.onload=function(){
    console.log(img.offsetWidth,img.offsetHeight);
}

0

เพียงผ่านวัตถุไฟล์ img ซึ่งได้มาจากองค์ประกอบอินพุตเมื่อเราเลือกไฟล์ที่ถูกต้องมันจะให้ความสูงและความกว้างของภาพในระดับ Netural

function getNeturalHeightWidth(file) {
     let h, w;
     let reader = new FileReader();
      reader.onload = () => {
        let tmpImgNode = document.createElement("img");
        tmpImgNode.onload = function() {
          h = this.naturalHeight;
          w = this.naturalWidth;
        };
        tmpImgNode.src = reader.result;
      };
      reader.readAsDataURL(file);
    }
   return h, w;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.