简体   繁体   English

如何按比例调整图像大小/保持纵横比?

[英]How to resize images proportionally / keeping the aspect ratio?

I have images that will be quite big in dimension and I want to shrink them down with jQuery while keeping the proportions constrained, ie the same aspect ratio.我有尺寸相当大的图像,我想用 jQuery 缩小它们,同时保持比例受限,即相同的纵横比。

Can someone point me to some code, or explain the logic?有人可以指出一些代码或解释逻辑吗?

I think this is a really cool method : 我认为这是一种非常酷的方法

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

Have a look at this piece of code from http://ericjuden.com/2009/07/jquery-image-resize/ 看看来自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
        }
    });
});

If I understand the question correctly, you don't even need jQuery for this. 如果我正确理解了这个问题,那么您甚至不需要jQuery。 Shrinking the image proportionally on the client can be done with CSS alone: just set its max-width and max-height to 100% . 仅使用CSS即可在客户端上按比例缩小图像:只需将其max-widthmax-height100%

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

Here's the fiddle: http://jsfiddle.net/9EQ5c/ 这是小提琴: http : //jsfiddle.net/9EQ5c/

In order to determine the aspect ratio , you need to have a ratio to aim for. 为了确定纵横比 ,您需要有一个目标比例。

高度

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

宽度

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. 在此示例中,我使用16:10因为这是典型的监视器宽高比。

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 上面的结果将是147300

actually i have just run into this problem and the solution I found was strangely simple and weird 其实我刚遇到这个问题,我发现的解决方案很奇怪又奇怪

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

and miraculously the image is resized to the new height and conserving the same ratio! 奇迹般地将图像调整为新的高度并保持相同的比例!

There are 4 parameters to this problem 这个问题有4个参数

  1. current image width iX 当前图像宽度iX
  2. current image height iY 当前图像高度iY
  3. target viewport width cX 目标视口宽度cX
  4. target viewport height cY 目标视口高度cY

And there are 3 different conditional parameters 并且有3个不同的条件参数

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

solution

  1. Find the smaller side of the target view port F 找到目标视口F的较小侧
  2. Find the larger side of the current view port L 查找当前查看端口L的较大侧
  3. Find the factor of both F/L = factor 找出两个F / L的因子=因子
  4. Multiply both sides of the current port with the factor ie, fX = iX * factor; 将当前端口的两侧乘以系数,即fX = iX *系数; fY = iY * factor fY = iY *因子

that's all you need to do. 这就是您需要做的。

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

This is a mature forum, I am not giving you code for that :) 这是一个成熟的论坛,我没有为您提供代码:)

Does <img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" > 是否<img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" > <img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" > help? <img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" >帮助?

Browser will take care of keeping aspect ratio intact. 浏览器会注意保持长宽比不变。

ie max-width kicks in when image width is greater than height and its height will be calculated proportionally. 也就是说,当图像宽度大于高度时, max-width宽度会增加,并将按比例计算其高度。 Similarly max-height will be in effect when height is greater than width. 同样,当高度大于宽度时, max-height将生效。

You don't need any jQuery or javascript for this. 您不需要任何jQuery或javascript。

Supported by ie7+ and other browsers ( http://caniuse.com/minmaxwh ). 受ie7 +和其他浏览器( http://caniuse.com/minmaxwh )的支持。

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
        }
    });
});
$('#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
});

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. 注意:如果width和height属性不适合图像,但他们不知道JS,搜索引擎将不喜欢它。

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

The resize can be achieved(maintaining aspect ratio) using CSS. 可以使用CSS来调整尺寸(保持纵横比)。 This is a further simplified answer inspired by Dan Dascalescu's post. 这是由Dan Dascalescu的帖子启发的进一步简化的答案。

http://jsbin.com/viqare 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"/> 

Here's a correction to Mehdiway's answer. 这是对Mehdiway答案的更正。 The new width and/or height were not being set to the max value. 新的宽度和/或高度未设置为最大值。 A good test case is the following (1768 x 1075 pixels): http://spacecoastsports.com/wp-content/uploads/2014/06/sportsballs1.png . 以下是一个很好的测试用例(1768 x 1075像素): http : //spacecoastsports.com/wp-content/uploads/2014/06/sportsballs1.png (I wasn't able to comment on it above due to lack of reputation points.) (由于缺乏声誉,我无法在上面对此发表评论。)

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

If the image is proportionate then this code will fill the wrapper with image. 如果图像是成比例的,则此代码将用图像填充包装器。 If image is not in proportion then extra width/height will get cropped. 如果图像不成比例,则多余的宽度/高度将被裁剪。

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

Have a look at this piece... 看看这块...

/**
 * @param {Number} width
 * @param {Number} height
 * @param {Number} destWidth
 * @param {Number} destHeight
 * 
 * @return {width: Number, height:Number}
 */
function resizeKeepingRatio(width, height, destWidth, destHeight)
{
    if (!width || !height || width <= 0 || height <= 0)
    {
        throw "Params error";
    }
    var ratioW = width / destWidth;
    var ratioH = height / destHeight;
    if (ratioW <= 1 && ratioH <= 1)
    {
        var ratio = 1 / ((ratioW > ratioH) ? ratioW : ratioH);
        width *= ratio;
        height *= ratio;
    }
    else if (ratioW > 1 && ratioH <= 1)
    {
        var ratio = 1 / ratioW;
        width *= ratio;
        height *= ratio;
    }
    else if (ratioW <= 1 && ratioH > 1)
    {
        var ratio = 1 / ratioH;
        width *= ratio;
        height *= ratio;
    }
    else if (ratioW >= 1 && ratioH >= 1)
    {
        var ratio = 1 / ((ratioW > ratioH) ? ratioW : ratioH);
        width *= ratio;
        height *= ratio;
    }
    return {
        width : width,
        height : height
    };
}

2 Steps: 2个步骤:

Step 1) calculate the ratio of the original width / original height of Image. 步骤1)计算Image的原始宽度/原始高度的比率。

Step 2) multiply the original_width/original_height ratio by the new desired height to get the new width corresponding to the new height. 步骤2)将original_width / original_height比值乘以新的所需高度,以获得与新高度相对应的新宽度。

This issue can be solved by CSS.这个问题可以通过 CSS 解决。

.image{
 max-width:*px;
}

Resize to fit the container, get scale factor, scale down percentage control调整大小以适合容器,获取比例因子,缩小百分比控制

 $(function () { let ParentHeight = 200; let ParentWidth = 300; $("#Parent").width(ParentWidth).height(ParentHeight); $("#ParentHeight").html(ParentHeight); $("#ParentWidth").html(ParentWidth); var RatioOfParent = ParentHeight / ParentWidth; $("#ParentAspectRatio").html(RatioOfParent); let ChildHeight = 2000; let ChildWidth = 4000; var RatioOfChild = ChildHeight / ChildWidth; $("#ChildAspectRatio").html(RatioOfChild); let ScaleHeight = ParentHeight / ChildHeight; let ScaleWidth = ParentWidth / ChildWidth; let Scale = Math.min(ScaleHeight, ScaleWidth); $("#ScaleFactor").html(Scale); // old scale //ChildHeight = ChildHeight * Scale; //ChildWidth = ChildWidth * Scale; // reduce scale by 10%, you can change the percentage let ScaleDownPercentage = 10; let CalculatedScaleValue = Scale * (ScaleDownPercentage / 100); $("#CalculatedScaleValue").html(CalculatedScaleValue); // new scale let NewScale = (Scale - CalculatedScaleValue); ChildHeight = ChildHeight * NewScale; ChildWidth = ChildWidth * NewScale; $("#Child").width(ChildWidth).height(ChildHeight); $("#ChildHeight").html(ChildHeight); $("#ChildWidth").html(ChildWidth); });
 #Parent { background-color: grey; } #Child { background-color: red; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="Parent"> <div id="Child"></div> </div> <table> <tr> <td>Parent Aspect Ratio</td> <td id="ParentAspectRatio"></td> </tr> <tr> <td>Child Aspect Ratio</td> <td id="ChildAspectRatio"></td> </tr> <tr> <td>Scale Factor</td> <td id="ScaleFactor"></td> </tr> <tr> <td>Calculated Scale Value</td> <td id="CalculatedScaleValue"></td> </tr> <tr> <td>Parent Height</td> <td id="ParentHeight"></td> </tr> <tr> <td>Parent Width</td> <td id="ParentWidth"></td> </tr> <tr> <td>Child Height</td> <td id="ChildHeight"></td> </tr> <tr> <td>Child Width</td> <td id="ChildWidth"></td> </tr> </table>

Resizing an image to a certain percentage将图像调整到特定百分比

// scale can be 0.40, 0.80, etc.
function imageScaler(originalHeight, originalWidth, scale) {
  const scaledWidth = originalWidth * scale;
  const scaledHeight = (originalHeight / originalWidth) * scaledWidth;
  return [scaledHeight, scaledWidth];
}

You can determine width height if you want a particular aspect ratio to do so, Let you have a picture of 3264×2448 Pictures aspect ratio is => 2448 ÷ 3264 =0.75 Now just check number which gives 0.75 on division.如果你想要一个特定的纵横比,你可以确定宽度高度,让你有一张 3264×2448 图片纵横比 => 2448 ÷ 3264 =0.75 现在只需检查数字,它在除法上给出 0.75。 Like: for 16:9 => 9÷16 =0.5625 (wrong it is not 0.75) Now 4:3 =>3÷4=0.75 (we get it ) So the original aspect ratio is 4:3 now to resize the image just do Width=3264 ÷/× 4 Height=2448 ÷/× 3 ÷ for reducing × for increasing Hope you can understand and code yourself this is very effective because we just need to do very basic arithmetic just division or multiplication so simple.比如:对于 16:9 => 9÷16 =0.5625(错了不是 0.75) 现在 4:3 =>3÷4=0.75 (我们明白了) 所以原来的宽高比是 4:3 现在调整图像大小只需做 Width=3264 ÷/× 4 Height=2448 ÷/× 3 ÷ 减少 × 增加希望你能理解并自己编写代码这是非常有效的,因为我们只需要做非常基本的算术只是除法或乘法这么简单。 Let me know if i am wrong.如果我错了,请告诉我。

This totally worked for me for a draggable item - aspectRatio:true 这对我来说完全适用于可拖动的项目-AspectRatio:true

.appendTo(divwrapper).resizable({
    aspectRatio: true,
    handles: 'se',
    stop: resizestop 
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM