2010-04-29 9 views
9

Si tengo una imagen de la cual conozco la altura y el ancho, ¿cómo puedo colocarla en un rectángulo con el mayor tamaño posible sin estirar la imagen?Haga que una imagen encaje en un rectángulo

El pseudocódigo es suficiente (pero voy a usar esto en Java).

Gracias.


Así que, basado en la respuesta, escribí esto: pero no funciona. ¿Qué hago mal?

double imageRatio = bi.getHeight()/bi.getWidth(); 
double rectRatio = getHeight()/getWidth(); 
if (imageRatio < rectRatio) 
{ 
    // based on the widths 
    double scale = getWidth()/bi.getWidth(); 
    g.drawImage(bi, 0, 0, (int) (bi.getWidth() * scale), (int) (bi.getHeight() * scale), this); 
} 
if (rectRatio < imageRatio) 
{ 
    // based on the height 
    double scale = getHeight()/bi.getHeight(); 
    g.drawImage(bi, 0, 0 , (int) (bi.getWidth() * scale), (int) (bi.getHeight() * scale), this); 
} 
+0

¿Quieres decir mantener la relación de aspecto en términos de ajuste? –

+0

@SB: Creo que sí (no entiendo exactamente lo que quiere decir ...) Por lo tanto, la fracción de ancho y alto tiene que ser la misma para la imagen de origen y la imagen a escala. –

Respuesta

15

determinar la relación de aspecto de ambos (altura dividida por la anchura, por ejemplo, tan alto, rectángulos flacos tienen una relación de aspecto> 1).

Si la relación de aspecto de su rectángulo es mayor que la de su imagen, calcule la imagen uniformemente en función de los anchos (ancho del rectángulo/ancho de la imagen).

Si la relación de aspecto de su rectángulo es inferior a la de su imagen, calcule la imagen uniformemente en función de las alturas (altura del rectángulo/altura de la imagen).

+0

¿Puedes ver mi actualización? –

+0

Por lo que puedo decir, parece que estás haciendo lo que sugerí, y creo que revisé mi lógica por segunda vez. ¿Son correctos los valores que está capturando en cada paso? (¿Están bi.GetWidth() y GetHeight() todos los números correctos?) (No soy programador de Java, pero me quedé en un Holiday Inn Express anoche;;)) – John

+0

Lo encontré: lo hice no use dobles –

7

Aquí es mi granito de arena:

/** 
* Calculate the bounds of an image to fit inside a view after scaling and keeping the aspect ratio. 
* @param vw container view width 
* @param vh container view height 
* @param iw image width 
* @param ih image height 
* @param neverScaleUp if <code>true</code> then it will scale images down but never up when fiting 
* @param out Rect that is provided to receive the result. If <code>null</code> then a new rect will be created 
* @return Same rect object that was provided to the method or a new one if <code>out</code> was <code>null</code> 
*/ 
private static Rect calcCenter (int vw, int vh, int iw, int ih, boolean neverScaleUp, Rect out) { 

    double scale = Math.min((double)vw/(double)iw, (double)vh/(double)ih); 

    int h = (int)(!neverScaleUp || scale<1.0 ? scale * ih : ih); 
    int w = (int)(!neverScaleUp || scale<1.0 ? scale * iw : iw); 
    int x = ((vw - w)>>1); 
    int y = ((vh - h)>>1); 

    if (out == null) 
     out = new Rect(x, y, x + w, y + h); 
    else 
     out.set(x, y, x + w, y + h); 

    return out; 
} 
+0

Gracias por este Mobistry. – Robinson

Cuestiones relacionadas