Làm cách nào để thay đổi kích thước hình ảnh theo tỷ lệ / giữ tỷ lệ khung hình?


167

Tôi có các hình ảnh sẽ có kích thước khá lớn và tôi muốn thu nhỏ chúng xuống với jQuery trong khi vẫn giữ tỷ lệ bị hạn chế, tức là tỷ lệ khung hình tương tự.

Ai đó có thể chỉ cho tôi một số mã, hoặc giải thích logic?


4
Bạn có thể giải thích tại sao jQuery phải được sử dụng không? Có một giải pháp chỉ CSS (xem câu trả lời của tôi ): đặt nó max-widthmax-heightthành 100%.
Dan Dascalescu

9
Chỉ trong trường hợp bất cứ ai không biết, nếu bạn chỉ đặt một chiều của hình ảnh (chiều rộng hoặc chiều cao) thì nó sẽ thay đổi kích thước. Đó là cách này kể từ buổi bình minh của trang web. Ví dụ:<img src='image.jpg' width=200>
GetFree

2
Ngoài ra, bạn có thể cân nhắc sử dụng một cái gì đó như slimmage.js để tiết kiệm băng thông và RAM thiết bị di động.
Sông Lilith

Câu trả lời:


188

Hãy xem đoạn mã này từ http://ericjuden.com/2009/07/jquery-image-resize/

$(document).ready(function() {
    $('.story-small img').each(function() {
        var maxWidth = 100; // Max width for the image
        var maxHeight = 100;    // Max height for the image
        var ratio = 0;  // Used for aspect ratio
        var width = $(this).width();    // Current image width
        var height = $(this).height();  // Current image height

        // Check if the current width is larger than the max
        if(width > maxWidth){
            ratio = maxWidth / width;   // get ratio for scaling image
            $(this).css("width", maxWidth); // Set new width
            $(this).css("height", height * ratio);  // Scale height based on ratio
            height = height * ratio;    // Reset height to match scaled image
            width = width * ratio;    // Reset width to match scaled image
        }

        // Check if current height is larger than max
        if(height > maxHeight){
            ratio = maxHeight / height; // get ratio for scaling image
            $(this).css("height", maxHeight);   // Set new height
            $(this).css("width", width * ratio);    // Scale width based on ratio
            width = width * ratio;    // Reset width to match scaled image
            height = height * ratio;    // Reset height to match scaled image
        }
    });
});

1
Xin lỗi, thiếu một số nhà toán học logic, bạn sẽ làm gì khi bạn cần tăng tất cả (giả sử, bạn đang tăng maxHeight)?
Ben

4
Điều này có thể được thực hiện với CSS một mình không? (chiều rộng tối đa, chiều cao: tự động, v.v.)
Tronathan

11
Không chắc chắn tại sao jQuery cần thiết cho việc này. Thu nhỏ hình ảnh theo tỷ lệ trên máy khách có thể được thực hiện bằng CSS và điều đó không quan trọng: chỉ cần đặt max-widthmax-heightlàm 100%. jsfiddle.net/9EQ5c
Dan Dascalescu

10
Điều này không thể được thực hiện với CSS vì TUYÊN BỐ NẾU. Tôi tin rằng vấn đề là điền vào hình ảnh thu nhỏ. Nếu hình ảnh quá cao, nó phải có chiều rộng tối đa, nếu hình ảnh quá rộng thì nó phải có chiều cao tối đa. Nếu bạn thực hiện CSS chiều rộng tối đa, chiều cao tối đa, bạn sẽ nhận được hình thu nhỏ với khoảng trắng thay vì điền đầy đủ
ntgCleaner

Là mã này có thể gây ra vấn đề trong trình duyệt, sự cố hoặc làm chậm ??
Trái phiếu Déjà

442

Tôi nghĩ rằng đây là một phương pháp thực sự hay :

 /**
  * Conserve aspect ratio of the original region. Useful when shrinking/enlarging
  * images to fit into a certain area.
  *
  * @param {Number} srcWidth width of source image
  * @param {Number} srcHeight height of source image
  * @param {Number} maxWidth maximum available width
  * @param {Number} maxHeight maximum available height
  * @return {Object} { width, height }
  */
function calculateAspectRatioFit(srcWidth, srcHeight, maxWidth, maxHeight) {

    var ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);

    return { width: srcWidth*ratio, height: srcHeight*ratio };
 }

33
Câu trả lời cực kỳ vượt trội! Câu trả lời đúng rơi thẳng trên mặt của nó nếu chiều cao VÀ chiều rộng đều lớn hơn. Thực sự, tốt, ria mép cũng tốt.
Starkers

1
Bạn nói đúng về điều đó @sstauross, pixel thập phân có thể có kết quả hơi bất ngờ . Trong trường hợp sử dụng của tôi, tuy nhiên, nó không đáng kể. Tôi cho rằng Math.floorsẽ thực sự giúp với một thiết kế hoàn hảo pixel :-)
Jason J. Nathan

1
Cảm ơn, tôi cần cái này gần như "một lớp lót".
Hernán

1
Cảm ơn Jason, câu trả lời này thực sự đã giúp tôi.
Ashok Shah

4
Đây là cách tuyệt vời để xử lý vấn đề này! Tôi đã tinh chỉnh nó một chút cho các phần tử img + ngăn phóng to hình ảnh:function imgSizeFit(img, maxWidth, maxHeight){ var ratio = Math.min(1, maxWidth / img.naturalWidth, maxHeight / img.naturalHeight); img.style.width = img.naturalWidth * ratio + 'px'; img.style.height = img.naturalHeight * ratio + 'px'; }
oriadam

70

Nếu tôi hiểu chính xác câu hỏi, bạn thậm chí không cần jQuery cho việc này. Thu nhỏ hình ảnh theo tỷ lệ trên máy khách có thể được thực hiện chỉ bằng CSS: chỉ cần đặt max-widthmax-heightthành 100%.

<div style="height: 100px">
<img src="http://www.getdigital.de/images/produkte/t4/t4_css_sucks2.jpg"
    style="max-height: 100%; max-width: 100%">
</div>​

Đây là câu đố: http://jsfiddle.net/9EQ5c/


2
Đây là một câu trả lời dễ dàng hơn nhiều so với ở trên. Cảm ơn. btw làm thế nào bạn có được liên kết "câu trả lời của tôi" để cuộn xuống bài viết của bạn?
SnareChops

@SnareChops: nó chỉ đơn giản là một neo HTML .
Dan Dascalescu

1
@SnareChops: nếu bạn sử dụng liên kết được cung cấp bởi liên kết "chia sẻ" bên dưới câu trả lời, nó cũng sẽ cuộn đến câu trả lời.
Flimm

1
@Flimm Vì các nhịp không hiển thị: chặn theo mặc định. Chỉ cần thêm display: block hoặc biến nó thành div.
mahemoff

1
Trong trường hợp của tôi, IMG đã được kết xuất với WordPress để thiết lập chiều rộng và chiều cao của mũ. Trong CSS tôi cũng phải thiết lập width: auto; height: auto;để chạy mã của bạn :)
lippoliv

12

Để xác định tỷ lệ khung hình , bạn cần phải có một tỷ lệ để nhắm tới.

Chiều cao

function getHeight(length, ratio) {
  var height = ((length)/(Math.sqrt((Math.pow(ratio, 2)+1))));
  return Math.round(height);
}

Chiều rộng

function getWidth(length, ratio) {
  var width = ((length)/(Math.sqrt((1)/(Math.pow(ratio, 2)+1))));
  return Math.round(width);
}

Trong ví dụ này tôi sử dụng 16:10vì đây là tỷ lệ khung hình màn hình điển hình.

var ratio = (16/10);
var height = getHeight(300,ratio);
var width = getWidth(height,ratio);

console.log(height);
console.log(width);

Kết quả từ trên sẽ là 147300


Xem xét, 300 = chiều rộng đường chéo = tỷ lệ chiều cao * và chiều cao giống như bạn đã nói
Johny Pie

6

thực sự tôi vừa gặp phải vấn đề này và giải pháp tôi tìm thấy thật đơn giản và kỳ lạ

$("#someimage").css({height:<some new height>})

và thật kỳ diệu, hình ảnh được thay đổi kích thước lên một tầm cao mới và bảo toàn tỷ lệ tương tự!


1
Tôi nghĩ rằng điều này hữu ích - nhưng tôi cho rằng nó sẽ không giới hạn hình ảnh nếu nói rất rộng, với chiều rộng tối đa ...
stephendwolff

Công cụ này hoạt động khi bạn không đặt thuộc tính khác. (chiều rộng trong trường hợp này)
NoobishPro

4

Có 4 thông số cho vấn đề này

  1. chiều rộng hình ảnh hiện tại iX
  2. chiều cao hình ảnh hiện tại iY
  3. chiều rộng khung nhìn mục tiêu cX
  4. chiều cao khung nhìn mục tiêu cY

Và có 3 thông số điều kiện khác nhau

  1. cX> cY?
  2. iX> cX?
  3. iY> cY?

giải pháp

  1. Tìm phía nhỏ hơn của cổng xem mục tiêu F
  2. Tìm phía lớn hơn của cổng xem hiện tại L
  3. Tìm hệ số của cả F / L = hệ số
  4. Nhân cả hai mặt của cổng hiện tại với hệ số tức là fX = iX *; yếu tố fY = iY *

đó là tất cả những gì bạn cần làm

//Pseudo code


iX;//current width of image in the client
iY;//current height of image in the client
cX;//configured width
cY;//configured height
fX;//final width
fY;//final height

1. check if iX,iY,cX,cY values are >0 and all values are not empty or not junk

2. lE = iX > iY ? iX: iY; //long edge

3. if ( cX < cY )
   then
4.      factor = cX/lE;     
   else
5.      factor = cY/lE;

6. fX = iX * factor ; fY = iY * factor ; 

Đây là một diễn đàn trưởng thành, tôi không cung cấp cho bạn mã cho điều đó :)


2
Đăng phương pháp đằng sau này là tuyệt vời, nhưng tôi đánh dấu bạn vì đã không thực sự giúp người dùng bằng cách đăng mã. Có vẻ hơi tắc nghẽn
Doidgey

6
"Ai đó có thể chỉ cho tôi một số mã, hoặc giải thích logic?" - Rõ ràng anh ấy ổn với việc chỉ có phương pháp giải thích cho anh ấy. Cá nhân, tôi nghĩ rằng đây sẽ là cách tốt hơn để hỗ trợ ai đó, giúp họ hiểu các phương pháp thay vì để họ sao chép và dán mã.
JessMcffy

@JessMcffy, thương hại các chỉnh sửa bazillion cho câu hỏi ban đầu đưa ra nhận xét của bạn ra khỏi bối cảnh :)
Jason J. Nathan

4

<img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" >giúp được không?

Trình duyệt sẽ chăm sóc giữ nguyên tỷ lệ khung hình.

tức là max-widthđá vào khi chiều rộng hình ảnh lớn hơn chiều cao và chiều cao của nó sẽ được tính theo tỷ lệ. Tương tự max-heightsẽ có hiệu lực khi chiều cao lớn hơn chiều rộng.

Bạn không cần bất kỳ jQuery hoặc javascript nào cho việc này.

Được hỗ trợ bởi eg7 + và các trình duyệt khác ( http://caniuse.com/minmaxwh ).


Mẹo tuyệt vời! Chỉ cần đặt CSS trong một tệp CSS và không trực tiếp trong mã html.
Đánh dấu

Tôi nghĩ vấn đề với điều này là nó sẽ không hoạt động khi bạn không biết chiều rộng tối đa và chiều cao tối đa là bao nhiêu cho đến khi tải trang. Đó là lý do tại sao một giải pháp JS là cần thiết. Điều này thường là trường hợp cho các trang web đáp ứng.
Jason J. Nathan

2

Điều này sẽ làm việc cho hình ảnh với tất cả các tỷ lệ có thể

$(document).ready(function() {
    $('.list img').each(function() {
        var maxWidth = 100;
        var maxHeight = 100;
        var width = $(this).width();
        var height = $(this).height();
        var ratioW = maxWidth / width;  // Width ratio
        var ratioH = maxHeight / height;  // Height ratio

        // If height ratio is bigger then we need to scale height
        if(ratioH > ratioW){
            $(this).css("width", maxWidth);
            $(this).css("height", height * ratioW);  // Scale height according to width ratio
        }
        else{ // otherwise we scale width
            $(this).css("height", maxHeight);
            $(this).css("width", height * ratioH);  // according to height ratio
        }
    });
});

2

Đây là một sửa chữa cho câu trả lời của Mehdiway. Chiều rộng và / hoặc chiều cao mới không được đặt thành giá trị tối đa. Một trường hợp thử nghiệm tốt là như sau (1768 x 1075 pixel): http://spacecoastsports.com/wp-content/uploads/2014/06/sportsballs1.png . (Tôi không thể nhận xét về nó ở trên do thiếu điểm danh tiếng.)

  // Make sure image doesn't exceed 100x100 pixels
  // note: takes jQuery img object not HTML: so width is a function
  // not a property.
  function resize_image (image) {
      var maxWidth = 100;           // Max width for the image
      var maxHeight = 100;          // Max height for the image
      var ratio = 0;                // Used for aspect ratio

      // Get current dimensions
      var width = image.width()
      var height = image.height(); 
      console.log("dimensions: " + width + "x" + height);

      // If the current width is larger than the max, scale height
      // to ratio of max width to current and then set width to max.
      if (width > maxWidth) {
          console.log("Shrinking width (and scaling height)")
          ratio = maxWidth / width;
          height = height * ratio;
          width = maxWidth;
          image.css("width", width);
          image.css("height", height);
          console.log("new dimensions: " + width + "x" + height);
      }

      // If the current height is larger than the max, scale width
      // to ratio of max height to current and then set height to max.
      if (height > maxHeight) {
          console.log("Shrinking height (and scaling width)")
          ratio = maxHeight / height;
          width = width * ratio;
          height = maxHeight;
          image.css("width", width);
          image.css("height", height);
          console.log("new dimensions: " + width + "x" + height);
      }
  }

2
$('#productThumb img').each(function() {
    var maxWidth = 140; // Max width for the image
    var maxHeight = 140;    // Max height for the image
    var ratio = 0;  // Used for aspect ratio
    var width = $(this).width();    // Current image width
    var height = $(this).height();  // Current image height
    // Check if the current width is larger than the max
    if(width > height){
        height = ( height / width ) * maxHeight;

    } else if(height > width){
        maxWidth = (width/height)* maxWidth;
    }
    $(this).css("width", maxWidth); // Set new width
    $(this).css("height", maxHeight);  // Scale height based on ratio
});

5
Vui lòng xem xét thêm một lời giải thích, không chỉ mã khi trả lời một bài viết.
Jørgen R

1

Nếu hình ảnh tương xứng thì mã này sẽ lấp đầy trình bao bọc bằng hình ảnh. Nếu hình ảnh không cân xứng thì chiều rộng / chiều cao thêm sẽ bị cắt.

    <script type="text/javascript">
        $(function(){
            $('#slider img').each(function(){
                var ReqWidth = 1000; // Max width for the image
                var ReqHeight = 300; // Max height for the image
                var width = $(this).width(); // Current image width
                var height = $(this).height(); // Current image height
                // Check if the current width is larger than the max
                if (width > height && height < ReqHeight) {

                    $(this).css("min-height", ReqHeight); // Set new height
                }
                else 
                    if (width > height && width < ReqWidth) {

                        $(this).css("min-width", ReqWidth); // Set new width
                    }
                    else 
                        if (width > height && width > ReqWidth) {

                            $(this).css("max-width", ReqWidth); // Set new width
                        }
                        else 
                            (height > width && width < ReqWidth)
                {

                    $(this).css("min-width", ReqWidth); // Set new width
                }
            });
        });
    </script>

1

Nếu không có temp-vars hoặc ngoặc bổ sung.

    var width= $(this).width(), height= $(this).height()
      , maxWidth=100, maxHeight= 100;

    if(width > maxWidth){
      height = Math.floor( maxWidth * height / width );
      width = maxWidth
      }
    if(height > maxHeight){
      width = Math.floor( maxHeight * width / height );
      height = maxHeight;
      }

Hãy ghi nhớ: Các công cụ tìm kiếm không thích nó, nếu thuộc tính chiều rộng và chiều cao không phù hợp với hình ảnh, nhưng họ không biết JS.


1

Sau một số thử nghiệm và lỗi tôi đã đến với giải pháp này:

function center(img) {
    var div = img.parentNode;
    var divW = parseInt(div.style.width);
    var divH = parseInt(div.style.height);
    var srcW = img.width;
    var srcH = img.height;
    var ratio = Math.min(divW/srcW, divH/srcH);
    var newW = img.width * ratio;
    var newH = img.height * ratio;
    img.style.width  = newW + "px";
    img.style.height = newH + "px";
    img.style.marginTop = (divH-newH)/2 + "px";
    img.style.marginLeft = (divW-newW)/2 + "px";
}

1

Thay đổi kích thước có thể đạt được (duy trì tỷ lệ khung hình) bằng CSS. Đây là một câu trả lời đơn giản hơn nữa lấy cảm hứng từ bài đăng của Dan Dascalescu.

http://jsbin.com/viqare

img{
     max-width:200px;
 /*Or define max-height*/
  }
<img src="http://e1.365dm.com/13/07/4-3/20/alastair-cook-ashes-profile_2967773.jpg"  alt="Alastair Cook" />

<img src="http://e1.365dm.com/13/07/4-3/20/usman-khawaja-australia-profile_2974601.jpg" alt="Usman Khawaja"/>


1

2 bước:

Bước 1) tính tỷ lệ giữa chiều rộng / chiều cao ban đầu của Ảnh.

Bước 2) nhân tỷ lệ gốc_ mật độ / gốc_height với chiều cao mới mong muốn để có chiều rộng mới tương ứng với chiều cao mới.


0

Vấn đề này có thể được giải quyết bằng CSS.

.image{
 max-width:*px;
}

-4

Điều này hoàn toàn làm việc cho tôi cho một mục có thể kéo - facRatio: true

.appendTo(divwrapper).resizable({
    aspectRatio: true,
    handles: 'se',
    stop: resizestop 
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.