2010-04-29 4 views
9

Si j'ai une image dont je connais la hauteur et la largeur, comment puis-je l'insérer dans un rectangle de la plus grande taille possible sans étirer l'image.Faire une image dans un rectangle

Pseudo-code est suffisant (mais je vais l'utiliser en Java).

Merci. Donc, sur la base de la réponse, j'ai écrit ceci: mais cela ne fonctionne pas. Qu'est-ce que je fais de 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

Voulez-vous dire maintenir le rapport d'aspect en termes de montage? –

+0

@SB: Je le pense (je ne comprends pas exactement ce que tu veux dire ...) Donc la fraction de largeur et de hauteur doit être la même par l'image source et l'image mise à l'échelle. –

Répondre

15

déterminer le rapport d'aspect à la fois (hauteur divisée par la largeur, par exemple, si grand, rectangles minces ont un rapport d'aspect> 1). Si le format de votre rectangle est supérieur à celui de votre image, redimensionnez l'image uniformément en fonction des largeurs (largeur du rectangle/largeur de l'image).

Si le format de votre rectangle est inférieur à celui de votre image, redimensionnez l'image uniformément en fonction des hauteurs (hauteur du rectangle/hauteur de l'image).

+0

Pouvez-vous consulter ma mise à jour? –

+0

Pour autant que je sache, il semble que vous fassiez ce que j'ai suggéré, et je crois que j'ai vérifié ma logique. Les valeurs sont-elles correctes que vous saisissez à chaque étape? (Est-ce que bi.GetWidth() et GetHeight() vous donnent tous les bons chiffres?) (Je ne suis pas programmeur Java, mais je suis resté à Holiday Inn Express hier soir;))) – John

+0

Je l'ai trouvé: je l'ai fait n'utilise pas de doubles –

7

Voici mes deux cents:

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

Merci pour ce Mobistry. – Robinson

Questions connexes