2009-11-05 30 views

Respuesta

12

Se podría calcular de forma manual,

es decir .:

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

Asegúrese de que utiliza los valores originales de la imagen de lo contrario se degradan con el tiempo.

EDIT: ejemplo, la versión de jQuery (no probado)

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

¿Hay una manera de establecer la anchura máxima y la altura de una imagen existente como - ImageResize ("imgID", anchoMax, maxHeight); He intentado con técnicas similares en PHP, pero mirando a través de los complementos de jquery no pude encontrar uno que hiciera el truco. – usertest

+0

Explica a qué te refieres con el máximo. Hay atributos de css de ancho/altura máximo, ¿no es eso lo que estás buscando? – Paul

+0

Gracias. El segundo ejemplo está cerca de lo que estaba buscando, pero el ejemplo no funciona. Por lo que puedo decir, uno de los problemas es que el cambio de ancho o alto debe establecerse mediante la función css(). Intenté eso pero el ejemplo todavía no funciona. ¿Eso es porque el aspectRatio no está configurado? – usertest

9

Uso JQueryUI Resizeable

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

aspectRatio: true -> mantener la relación de aspecto original

+1

Sí, pero eso implica una gran cantidad de gastos indirectos si no está utilizando la interfaz de usuario. – Paul

+4

De acuerdo, pero es código que no necesita escribir/mantener. –

+0

Por supuesto, es muy posible que ya intente replicar la funcionalidad del complemento redimensionable ... llamar a tamaño redimensionable va a mucho más que simplemente cambiar el tamaño de la imagen, por cierto. – Paul

19

He aquí una función útil que podría hacer lo usted quiere:

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

Básicamente, toma un elemento, lo centra dentro del elemento principal y luego lo estira para que no quede visible el fondo de ninguno de los padres, mientras mantiene la relación de aspecto.

Por otra parte, esto podría no ser lo que desea hacer.

+2

¡Gracias, fue una gran ayuda! – sowasred2012

+0

Esto a veces provocará que newWidth o newHeight sean más grandes que las dimensiones primarias respectivas. En cambio, recomendaría algo como: http://stackoverflow.com/a/115492/175830 –

+1

@JasonAxelson: Ese es el punto en mi respuesta. Este código garantiza que ambas dimensiones de la imagen sean ** mayores que ** o iguales a la dimensión del elemento principal. Esto tiene como objetivo cubrir, no llenar. – Eric

1

No existe una explicación de la cantidad de copias y empanadas que hay por ahí eh! También quería saber esto y todo lo que vi fueron ejemplos interminables de ancho de escala O altura ... ¿quién querría que el otro se desborde?

  • ancho de cambiar el tamaño y altura sin la necesidad de un bucle
  • no sea superior a las imágenes dimensiones originales
  • Usos matemáticas que funciona correctamente es decir, la anchura/altura de aspecto, y la altura * aspecto de ancho para que las imágenes son en realidad las proporciones adecuadas de arriba a abajo:/

debe ser recta hacia adelante lo suficiente como para convertir a JavaScript u otros lenguajes

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

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

Si el alto y el ancho de la imagen son más pequeños que maxHeight, maxWidth no escalará la imagen. – tech20nn

Cuestiones relacionadas