Görüntüleri orantılı olarak yeniden boyutlandırma / en boy oranını koruma


167

Boyut olarak oldukça büyük görüntülerim olacak ve oranları kısıtlı tutarken jQuery ile küçültmek istiyorum, yani aynı en boy oranı.

Birisi beni bazı kodlara yönlendirebilir veya mantığı açıklayabilir mi?


4
JQuery'nin neden kullanılması gerektiğini açıklayabilir misiniz? CSS-tek çözüm (bkz var benim cevap ): onun set max-widthve max-heightiçin 100%.
Dan Dascalescu

9
Herhangi birinin bilmemesi durumunda, görüntünün yalnızca bir boyutunu (genişlik veya yükseklik) ayarlarsanız, orantılı olarak yeniden boyutlandırılır. Web'in başlangıcından beri bu şekilde oldu. Örneğin:<img src='image.jpg' width=200>
GetFree

2
Ayrıca, bant genişliğini ve mobil cihaz RAM'ini kaydetmek için slimmage.js gibi bir şey kullanmayı düşünebilirsiniz .
Lilith River

Yanıtlar:


188

Http://ericjuden.com/2009/07/jquery-image-resize/ adresinden bu koda bir göz atın.

$(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
Üzgünüm, bazı matematikçi mantığı eksik… hepsini arttırmanız gerektiğinde ne var (diyelim ki maxHeight'ı artırıyorsunuz)?
Ben

4
Bu sadece CSS ile yapılabilir mi? (maksimum genişlik, yükseklik: otomatik, vb?)
Tronathan

11
Bunun için neden jQuery gerektiğinden emin değilim. İstemci üzerinde orantılı görüntü Küçülen CSS ile yapılabilir ve bu Önemsiz: sadece onun set max-widthve max-heightiçin 100%. jsfiddle.net/9EQ5c
Dan Dascalescu

10
EĞER BİLDİRİMİ nedeniyle bu CSS ile yapılamaz. Bence konu küçük resmi doldurmak. Görüntü çok uzunsa, maksimum genişlik, görüntü çok genişse, maksimum yükseklik olmalıdır. CSS maksimum genişlik, maksimum yükseklik yaparsanız, tam olarak doldurmak yerine boşluk içeren küçük resimler alırsınız
ntgCleaner 14:13

Bu kod tarayıcılarda, çökmelere veya yavaşladı sorunlara neden olabilir mi?
Déjà Bond

444

Bu gerçekten harika bir yöntem olduğunu düşünüyorum :

 /**
  * 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
Son derece üstün cevap! Yükseklik ve genişliğin ikisi de daha büyükse doğru cevap yüzüne düz düşer. Gerçekten, iyi, aynı zamanda güzel bıyık.
Starkers

1
@Sstauross, ondalık piksellerin biraz beklenmedik sonuçlara yol açabileceğini düşünüyorsunuz . Ancak benim kullanım durumumda, ihmal edilebilir. Sanırım Math.floorgerçekten mükemmel bir piksel tasarımına yardımcı olacak :-)
Jason J. Nathan

1
Teşekkürler, buna neredeyse "tek astarlı" lazım.
Hernán

1
Teşekkürler Jason, bu cevap bana gerçekten yardımcı oldu.
Ashok Shah

4
Bu sorunu ele almanın harika bir yolu! Ben img elemanları için biraz tweaked + görüntüyü 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'; }
büyütmeyi

70

Soruyu doğru anlarsam, bunun için jQuery'ye bile ihtiyacınız yoktur. Görüntüyü istemcide orantılı olarak küçültmek yalnızca CSS ile yapılabilir: sadece max-widthve max-heightdeğerini ayarlayın 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>​

İşte keman: http://jsfiddle.net/9EQ5c/


2
Bu, yukarıdakinden çok daha kolay bir cevaptır. Teşekkürler. btw yayınınıza geçmek için "cevabım" bağlantısını nasıl aldınız?
SnareChops

@SnareChops: sadece bir HTML bağlantısıdır .
Dan Dascalescu

1
@SnareChops: Cevabın altındaki "paylaş" bağlantısının verdiği bağlantıyı kullanırsanız, cevaba da kayar.
Flimm

1
@Flimm Açıklıklar görüntülenmediğinden: varsayılan olarak engelle. Sadece display: block'u ekleyin ya da bir div yapın.
mahemoff

1
Benim durumumda IMG, WordPress ile işlendi, böylece şapka genişliği ve yüksekliği ayarlandı. CSS de width: auto; height: auto;kodunuzu çalıştırmak için ayarlamak zorunda kaldım :)
lippoliv 15

12

En boy oranını belirlemek için , hedefleyeceğiniz bir orana sahip olmanız gerekir.

Yükseklik

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

Genişlik

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

Bu örnekte 16:10tipik monitör en boy oranını kullandığımdan beri kullanıyorum .

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

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

Yukarıdaki sonuçlar 147ve300


Dikkate alındığında, 300 = diyagonal genişlik = yükseklik * oranı ve yükseklik söylediğinizle aynıdır
Johny Pie

6

aslında bu problemle karşılaştım ve bulduğum çözüm garip bir şekilde basit ve garipti

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

ve mucizevi bir şekilde görüntü yeni yüksekliğe yeniden boyutlandırılır ve aynı oran korunur!


1
... ama çok çok geniş desem maksimum genişliğe, görüntüyü sınırlamak olmaz herhalde - i bu yararlı olduğunu düşünüyorum
stephendwolff

Bu özellik, diğer özelliği ayarlamadığınızda çalışır. (bu durumda genişlik)
NoobishPro

4

Bu sorunun 4 parametresi vardır

  1. geçerli resim genişliği iX
  2. geçerli resim yüksekliği iY
  3. hedef görüntü alanı genişliği cX
  4. hedef görüntü alanı yüksekliği cY

Ve 3 farklı koşullu parametre var

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

çözüm

  1. Hedef görünüm bağlantı noktası F'nin daha küçük tarafını bulun
  2. Geçerli görünüm bağlantı noktasının daha büyük tarafını bulun L
  3. Her iki F / L = faktörünün faktörünü bulun
  4. Geçerli bağlantı noktasının her iki tarafını da faktör ile çarpın, yani fX = iX * faktörü; fY = iY * faktörü

tüm yapmanız gereken bu.

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

Bu olgun bir forum, bunun için size kod vermiyorum :)


2
Bunun arkasındaki yöntemi göndermek harika, ama aslında kod göndererek kullanıcıya yardım etmediğiniz için sizi işaretliyorum. Biraz engel görünüyor
Doidgey

6
"Birisi beni bir koda yönlendirebilir mi, yoksa mantığı açıklayabilir mi?" - Açıkçası, sadece yöntemin kendisine açıklanması konusunda iyiydi. Şahsen, bunun birisine yardım etmenin, kodları kopyalayıp yapıştırmak yerine yöntemleri anlamalarına yardımcı olmak için daha iyi bir yol olacağını düşünüyorum.
JessMcintosh

@JessMcintosh, orijinal soruya bazilyon düzenlemeleri yazık yorumunuzu bağlam dışı hale getirdi :)
Jason J. Nathan

4

mu <img src="/path/to/pic.jpg" style="max-width:XXXpx; max-height:YYYpx;" > olur mu?

Tarayıcı, en-boy oranını sağlam tutmaya özen gösterir.

örneğin max-width, görüntü genişliği yükseklikten büyük olduğunda ve yüksekliği orantılı olarak hesaplandığında devreye girer. benzer şekildemax-heightYükseklik genişlikten büyük olduğunda da olacaktır.

Bunun için herhangi bir jQuery veya javascript gerekmez.

İe7 + ve diğer tarayıcılar tarafından desteklenir ( http://caniuse.com/minmaxwh ).


Harika bir ipucu! CSS'yi doğrudan html koduna değil, bir CSS dosyasına koyarsınız.
Mark

Bununla ilgili sorun, sayfa yüklenene kadar maksimum genişlik ve maksimum yüksekliğin ne olduğunu bilmediğinizde işe yaramayacağıdır. Bu yüzden bir JS çözümü gereklidir. Bu genellikle duyarlı siteler için geçerlidir.
Jason

2

Bu, olası tüm oranlara sahip görüntüler için çalışmalıdır

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

İşte Mehdiway'in cevabına bir düzeltme. Yeni genişlik ve / veya yükseklik maksimum değere ayarlanmamıştı. İyi bir test örneği şöyledir (1768 x 1075 piksel): http://spacecoastsports.com/wp-content/uploads/2014/06/sportsballs1.png . (İtibar puanı eksikliği nedeniyle yukarıda yorum yapamadım.)

  // 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
Lütfen bir gönderiyi yanıtlarken yalnızca kod değil, açıklama ekleyin.
Jørgen R

1

Görüntü orantılıysa, bu kod sarmalayıcıyı görüntü ile dolduracaktır. Görüntü orantılı değilse ekstra genişlik / yükseklik kırpılır.

    <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

Ek geçici değişkenler veya braketler olmadan.

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

Unutmayın: Genişlik ve yükseklik özelliği görüntüye uymuyorsa arama motorları hoşlanmıyor, ancak JS bilmiyorlar.


1

Biraz deneme yanılma sonrasında bu çözüme geldim:

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

Yeniden boyutlandırma (en boy oranını koruyarak) CSS kullanılarak elde edilebilir. Bu, Dan Dascalescu'nun gönderisinden ilham alan daha basit bir cevaptır.

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 Adım:

Adım 1) Görüntünün orijinal genişliğinin / orijinal yüksekliğinin oranını hesaplayın.

Adım 2) Yeni yüksekliğe karşılık gelen yeni genişliği elde etmek için original_width / original_height oranını istenen yeni yükseklikle çarpın.


0

Bu sorun CSS tarafından çözülebilir.

.image{
 max-width:*px;
}

-4

Bu tamamen sürüklenebilir bir ürün için benim için çalıştı - aspectRatio: true

.appendTo(divwrapper).resizable({
    aspectRatio: true,
    handles: 'se',
    stop: resizestop 
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.