web-dev-qa-db-fra.com

jQuery redimensionner au format

Comment pourrais-je redimensionner une image dans jQuery à un rapport d'aspect cohérent. Par exemple, définissez la hauteur maximale et redimensionnez correctement la largeur. Merci.

13
usertest

Vous pouvez calculer cela manuellement,

c'est à dire.:

function GetWidth(newHeight,orginalWidth,originalHeight)
{
if(currentHeight == 0)return newHeight;
var aspectRatio = currentWidth / currentHeight;
return newHeight * aspectRatio;
}

Assurez-vous d'utiliser les valeurs ORIGINAL pour l'image, sinon elle se dégradera avec le temps.

EDIT: exemple de version jQuery (non testé)

jQuery.fn.resizeHeightMaintainRatio = function(newHeight){
    var aspectRatio = $(this).data('aspectRatio');
    if (aspectRatio == undefined) {
        aspectRatio = $(this).width() / $(this).height();
        $(this).data('aspectRatio', aspectRatio);
    }
    $(this).height(newHeight); 
    $(this).width(parseInt(newHeight * aspectRatio));
}
13
Paul

Voici une fonction utile qui pourrait faire ce que vous voulez:

jQuery.fn.fitToParent = function()
{
    this.each(function()
    {
        var width  = $(this).width();
        var height = $(this).height();
        var parentWidth  = $(this).parent().width();
        var parentHeight = $(this).parent().height();

        if(width/parentWidth < height/parentHeight) {
            newWidth  = parentWidth;
            newHeight = newWidth/width*height;
        }
        else {
            newHeight = parentHeight;
            newWidth  = newHeight/height*width;
        }
        var margin_top  = (parentHeight - newHeight) / 2;
        var margin_left = (parentWidth  - newWidth ) / 2;

        $(this).css({'margin-top' :margin_top  + 'px',
                     'margin-left':margin_left + 'px',
                     'height'     :newHeight   + 'px',
                     'width'      :newWidth    + 'px'});
    });
};

Fondamentalement, il saisit un élément, le centre dans le parent, puis l'étend pour qu'il s'adapte de sorte qu'aucun arrière-plan du parent ne soit visible, tout en maintenant les proportions.

Là encore, cela pourrait ne pas être ce que vous voulez faire.

19
Eric

Utilisez UI JQuery redimensionnable

$("#some_image").resizable({ aspectRatio:true, maxHeight:300 });

rapport hauteur/largeur: true -> conserver le rapport hauteur/largeur d'origine

9
Jason Harwig

Il n'y a pas de comptabilité pour la quantité de copie et les pasters là-bas hein! Je voulais aussi le savoir et je n'ai vu que des exemples sans fin de largeur de mise à l'échelle OR de hauteur .. qui voudrait que l'autre déborde?!

  • Redimensionner la largeur ET la hauteur sans avoir besoin d'une boucle
  • Ne dépasse pas les dimensions d'origine des images
  • Utilise des maths qui fonctionnent correctement, c'est-à-dire largeur/aspect pour la hauteur et hauteur * aspect pour la largeur, de sorte que les images soient réellement redimensionnées correctement vers le haut et le bas: /

Devrait être assez simple pour convertir en javascript ou d'autres langues

//////////////

private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double srcWidth = img.Width;
    double srcHeight = img.Height;

    double resizeWidth = srcWidth;
    double resizeHeight = srcHeight;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}
1
Dominic

C'est une bonne solution si vous avez besoin d'un rapport de hauteur et de largeur parfaits après la récolte, cela donnera un rapport de culture parfait.

getPerfectRatio(img,widthRatio,heightRatio){

  if(widthRatio < heightRatio){
    var height = img.scalingHeight - (img.scalingHeight % heightRatio);
    var finalHeight = height
    var finalWidth = widthRatio * (height/heightRatio);

    img.cropHeight = finalHeight;
    img.cropWidth = finalWidth
  }
  if(heightRatio < widthRatio){;
    var width = img.scalingWidth - (img.scalingWidth % widthRatio);
    var finalWidth = width;
    var finalHeight  = heightRatio * (width/widthRatio);
    img.cropHeight = finalHeight;
    img.cropWidth = finalWidth
  }

  return img
  
}

0
sourabh