2010-04-29 6 views
9

Wenn ich ein Bild habe, von dem ich die Höhe und die Breite kenne, wie kann ich es in ein Rechteck mit der größtmöglichen Größe passen, ohne das Bild zu strecken.Machen Sie ein Bild in ein Rechteck passen

Pseudo-Code ist genug (aber ich werde das in Java verwenden).

Danke.


Also, basierend auf der Antwort, schrieb ich das: aber es funktioniert nicht. Was mache ich falsch?

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

Meinen Sie Seitenverhältnis in Bezug auf die Armatur halten? –

+0

@SB: Ich denke schon (ich verstehe nicht genau, was du meinst ...) Also der Bruch von Breite und Höhe muss gleich sein von dem Quellbild und dem skalierten Bild. –

Antwort

15

das Seitenverhältnis der beiden Bestimmen (Höhe dividiert durch Breite etwa so groß, dünne Rechtecke haben ein Aspektverhältnis> 1).

Wenn das Seitenverhältnis Ihres Rechtecks ​​größer als das Ihres Bilds ist, skalieren Sie das Bild gleichmäßig basierend auf den Breiten (Rechteckbreite/Bildbreite).

Wenn das Seitenverhältnis Ihres Rechtecks ​​kleiner als das Ihres Bilds ist, skalieren Sie das Bild gleichmäßig basierend auf den Höhen (Rechteckhöhe/Bildhöhe).

+0

Können Sie mein Update überprüfen? –

+0

Soweit ich das beurteilen kann, sieht es so aus, als würden Sie tun, was ich vorgeschlagen habe, und ich glaube, ich habe meine Logik überprüft. Stimmen die Werte bei jedem Schritt überein? (Sind bi.GetWidth() und GetHeight() alle die richtigen Zahlen?) (Ich bin kein Java-Programmierer, aber ich war letzte Nacht in einem Holiday Inn Express!)) – John

+0

Ich fand es: Ich tat es nicht benutzen Doppel –

7

Hier ist meine zwei Cent:

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

Danke für diese Mobistry. – Robinson