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

IT技术 javascript jquery image resize
2021-01-16 13:50:59

我有尺寸很大的图像,我想用 jQuery 缩小它们,同时保持比例受限,即相同的纵横比。

有人可以指点我一些代码,或者解释一下逻辑吗?

6个回答

我认为这是一个非常酷的方法

 /**
  * 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 };
 }
这将是理想的@AdrienBe,但这个问题一年多前就得到了回答,我认为它很简单,可以适应个人定制。:)
2021-03-15 13:50:59
+1 它非常整洁。如何声明诸如 之类的函数function calculateAspectRatioFit(dimensions) { /* then use such as dimensions.maxWidth , dimensions.srcWidth ...*/ },然后调用诸如 之类的函数function({ maxWidth: someWidth, srcWidth: someOtherWith, maxHeight: someHeight, srcHeight: someOtherHeight });呢?这对于避免参数顺序问题很有用。
2021-03-17 13:50:59
@sstauross 你是对的,十进制像素可能会产生一些意想不到的结果然而,在我的用例中,它可以忽略不计。我想Math.floor这真的有助于 像素 完美的设计:-)
2021-03-22 13:50:59
非常优秀的答案!如果高度和宽度都较大,则正确答案会落在其脸上。真的,不错,小胡子也不错。
2021-03-25 13:50:59
这是处理这个问题的绝妙方法!我对 img 元素进行了一些调整 + 防止放大图像: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'; }
2021-04-05 13:50:59

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
        }
    });
});
抱歉,遗漏了一些数学家的逻辑……当您需要全部增加时(假设您要增加 maxHeight)怎么办?
2021-03-12 13:50:59
由于 IF 语句,这不能用 CSS 完成。我相信重点是填写缩略图。如果图像太高,它必须是最大宽度,如果图像太宽,它必须是最大高度。如果你做 CSS max-width, max-height,你会得到带有空格而不是完全填充的缩略图
2021-03-12 13:50:59
不知道为什么需要 jQuery。在客户端按比例缩小图像可以使用 CSS 来完成,这很简单:只需将其设置为max-widthmax-height即可100%jsfiddle.net/9EQ5c
2021-03-15 13:50:59
这段代码是否会导致浏览器出现问题、崩溃或变慢??
2021-03-17 13:50:59
这可以单独使用 CSS 来完成吗?(最大宽度,高度:自动等?)
2021-04-06 13:50:59

如果我正确理解了这个问题,那么您甚至不需要 jQuery。在客户端按比例缩小图像可以单独使用 CSS 完成:只需将其设置为max-widthmax-height即可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>​

这是小提琴:http : //jsfiddle.net/9EQ5c/

@SnareChops:它只是一个HTML 锚点
2021-03-14 13:50:59
@Flimm 因为跨度不显示:默认情况下阻止。只需添加 display: 块,或使其成为一个 div。
2021-03-15 13:50:59
@SnareChops:如果您使用答案下的“分享”链接给出的链接,它也会滚动到答案。
2021-03-16 13:50:59
在我的例子中,IMG 是用 WordPress 渲染的,所以它设置了宽度和高度。在 CSS 中,我还必须设置width: auto; height: auto;让您的代码运行 :)
2021-03-26 13:50:59
这是一个比上面更容易的答案。谢谢。顺便说一句,您是如何获得“我的答案”链接以向下滚动到您的帖子的?
2021-04-09 13:50:59

为了确定纵横比,您需要有一个目标比例。

高度

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

在这个例子中,我使用16:10了典型的显示器纵横比。

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

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

上面的结果将是147300

考虑到,300=对角线宽度=高度*比例,高度和你说的一样
2021-04-07 13:50:59

实际上我刚刚遇到了这个问题,我发现的解决方案非常简单和奇怪

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

并且奇迹般地将图像调整到新的高度并保持相同的比例!

我认为这很有用 - 但我想如果非常宽,它不会将图像限制到最大宽度......
2021-03-17 13:50:59
当您不设置其他属性时,这些东西会起作用。(在这种情况下的宽度)
2021-04-02 13:50:59