How to resize images proportionally / keeping the aspect ratio?

前端 未结 18 1672
野趣味
野趣味 2020-11-22 13:58

I have images that will be quite big in dimension and I want to shrink them down with jQuery while keeping the proportions constrained, i.e. the same aspect ratio.

C

相关标签:
18条回答
  • 2020-11-22 14:28

    Have a look at this piece of code from 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
            }
        });
    });
    
    0 讨论(0)
  • 2020-11-22 14:29
    $('#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
    });
    
    0 讨论(0)
  • 2020-11-22 14:30

    In order to determine the aspect ratio, you need to have a ratio to aim for.

    Height

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

    Width

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

    In this example I use 16:10 since this the typical monitor aspect ratio.

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

    Results from above would be 147 and 300

    0 讨论(0)
  • 2020-11-22 14:32

    After some trial and error I came to this solution:

    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";
    }
    
    0 讨论(0)
  • 2020-11-22 14:33

    This should work for images with all possible proportions

    $(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
            }
        });
    });
    
    0 讨论(0)
  • 2020-11-22 14:33

    Without additional temp-vars or brackets.

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

    Keep in Mind: Search engines don't like it, if width and height attribute does not fit the image, but they don't know JS.

    0 讨论(0)
提交回复
热议问题