Как пропорционально изменить размер изображения / сохранить соотношение сторон? - PullRequest
143 голосов
/ 19 октября 2010

У меня есть изображения, которые будут довольно большими по размеру, и я хочу уменьшить их с помощью jQuery, сохраняя пропорции, то есть такое же соотношение сторон.

Может кто-нибудь указать мне какой-нибудь код или объяснитьлогика?

Ответы [ 17 ]

389 голосов
/ 06 февраля 2013

Я думаю, что это действительно крутой метод :

 /**
  * 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 };
 }
169 голосов
/ 19 октября 2010

Посмотрите на этот фрагмент кода из 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
        }
    });
});
64 голосов
/ 01 сентября 2012

Если я правильно понимаю вопрос, вам даже не нужен jQuery для этого.Пропорциональное сжатие изображения на клиенте может быть выполнено только с помощью CSS: просто установите для max-width и max-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/

10 голосов
/ 28 мая 2015

Чтобы определить соотношение сторон , вам нужно иметь соотношение, к которому нужно стремиться.

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

В этом примере я использую 16:10, поскольку это типичное соотношение сторон монитора.

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

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

Результаты сверху будут 147 и 300

6 голосов
/ 07 августа 2012

на самом деле я только что столкнулся с этой проблемой, и решение, которое я нашел, было странно простым и странным

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

и чудом размер изображения изменяется до новой высоты и сохраняется то же соотношение!

4 голосов
/ 05 апреля 2014

Помогает ли <img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" >?

Браузер позаботится о сохранении пропорций.

т.е. max-width включается, когда ширина изображения больше высоты, а его высота будет рассчитываться пропорционально.Аналогичным образом max-height будет действовать, когда высота больше ширины.

Для этого вам не нужен jQuery или javascript.

Поддерживается ie7 + и другими браузерами (http://caniuse.com/minmaxwh).

4 голосов
/ 16 мая 2012

Существует 4 параметра для этой проблемы

  1. текущая ширина изображения iX
  2. текущая высота изображения iY
  3. ширина области просмотра цели cX
  4. цельвысота области просмотра cY

И есть 3 различных условных параметра

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

решение

  1. Найти меньшую сторону целевого порта просмотра F
  2. Найти большую сторону текущего порта просмотра L
  3. Найти коэффициент как F / L = коэффициент
  4. Умножить обе стороны текущего порта на коэффициент, т. Е. FX = iX * factor;fY = iY * factor

это все, что вам нужно сделать.

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

Это зрелый форум, я не даю вам код для этого:)

2 голосов
/ 22 июля 2015

Это должно работать для изображений со всеми возможными пропорциями

$(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 голосов
/ 04 февраля 2012
$('#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
});
1 голос
/ 15 июля 2014

После некоторых проб и ошибок я пришел к этому решению:

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