2013-01-07 16 views
5

Próbuję zmienić rozmiar obrazu, zachowując proporcje. Powinien być wystarczająco duży, aby wypełnić ekran bez pustej przestrzeni, a w razie potrzeby część obrazu powinna być poza ekranem.Obliczanie rozmiaru obrazu dzięki zachowaniu proporcji przy różnych rozdzielczościach ekranu

Poniższy obraz pokazuje, jak żółty obraz powinien być dobrany na podstawie rozmiaru czarnego ekranu.

enter image description here

Herezje Kodeks że ja rzeczywiście przy, czy istnieje lepszy sposób to zrobić?

if(bwidth > bheight) { 
    if(bwidth > swidth && bheight > sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth > swidth && bheight < sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth < swidth && bheight > sheight) { 
     new_height = sheight; 
     new_width = (int) ((double) (bwidth/100)*(sheight/((double) (bheight)/100))); 

    } else if(bwidth >= swidth && bheight >= sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 
    } 

} else if(bwidth < bheight) { 
    if(bwidth > swidth && bheight > sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight > sheight) {   
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth < swidth && bheight < sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } else if(bwidth >= swidth && bheight >= sheight) { 
     new_width = swidth; 
     new_height = (int) ((double) (bheight/100)*(swidth/((double) (bwidth)/100))); 

    } 
} 
  • swidth = szerokość ekranu
  • sheight = ekranie wysokość
  • szer_przycisku = szerokość obrazu
  • wys_przycisku = wysokość obrazu
+0

chcesz wyciąć obszar niewidoczny lub zmienić proporcje – mKorbel

+0

Nie wiem, jeśli cięcie jest konieczne, gdyż będzie on niewidoczny, należy po prostu pasują do ekran, zawsze –

+0

masz tam dość dużo niepotrzebnego kodu - a co powiesz na ponowne przeanalizowanie tego, co najważniejsze, aby łatwiej było go przeczytać? – GreyBeardedGeek

Odpowiedz

-2

Cóż, dziękuję @Erick Robertson Zmieniono nieco, ale teraz działa!

Oto kod Zmieniono:

if (bwidth/swidth < bheight/sheight) { 
    new_width = swidth; 
    new_height = (int) Math.floor((double) bheight 
            * (double) swidth/(double) bwidth); 
} else { 
    new_height = sheight; 
    new_width = (int) Math.floor((double) bwidth 
           * (double) sheight/(double) bheight); 
} 
+0

Po co pisać odpowiedź na własne pytanie, a następnie zaakceptować to zamiast odpowiedzi, której informacje umożliwiły rozwiązanie problemu? Wydaje się to bardzo nieregularne. – scottb

9

porównania współczynników.

Jeśli stosunek szerokości do wysokości obrazu jest większy niż stosunek szerokości do wysokości ekranu, to wiesz, że będziesz korzystać z szerokości ekranu i obliczania wysokości. W przeciwnym razie będziesz używał wysokości ekranu i obliczania szerokości. Upewnij się tylko, że żadna z wysokości nie wynosi zero!

Należy pamiętać, że kod w tym miejscu spowoduje zmianę rozmiaru obrazu, tak aby zawsze wypełniał ekran. Skutecznie przycina każdą dodatkową część obrazu. Aby obraz był jak największy, a jednocześnie był widoczny, zmień < na > w pierwszym wierszu.

if (bwidth/bheight < swidth/sheight) { 
    new_width = swidth; 
    new_height = (int) Math.floor((double) bheight 
            * (double) swidth/(double) bwidth); 
} else { 
    new_height = sheight; 
    new_width = (int) Math.floor((double) bwidth 
           * (double) sheight/(double) bheight); 
} 

Ja również jeszcze kilka ulepszeń:

  • uprościł równania. Dzielenie licznika i mianownika przez 100 nie robi nic.
  • Uproszczenie typowania. Nie znam typu każdej zmiennej, ale wszystkie muszą być podwójne.
  • Używana Math.floor zamiast zwykłej kasty typograficznej do int, aby się upewnić, że się nie zaokrągla.
+0

czekaj .. testuję twój kod, zmieniłem się trochę, działa teraz na panoramicznych zdjęciach :) –

+0

Myślę, że miałem moje zrozumienie wstecz. Kod, który napisałem, był taki, że mogłeś zobaczyć cały obraz na ekranie. Wygląda na to, że chcesz wypełnić ekran i zagwarantować przewijanie tylko w jednym kierunku? –

+0

właśnie wypełnia, bez przewijania ... kod i zmienia się na działa dla mnie .. dziękuję za pomoc –

Powiązane problemy