2011-08-11 14 views
5

Zastanawiam się, czy ktoś może mi pomóc z matematyki/pseudo kod/kod java skalować obraz do docelowego wymiaru. wymaganie to utrzymanie proporcji obrazu, ale nie spada poniżej wymiaru docelowego w skalach x i y. ostateczny obliczony wymiar może być większy niż żądany cel, ale musi być najbliższy celowi.Skaluj obraz zachowując proporcje bez spadku poniżej celów

przykład: Mam obraz o wielkości 200x100. musi zostać przeskalowany do wymiaru docelowego 30x10. Muszę znaleźć minimalny wymiar zachowujący proporcje punktu początkowego, w którym skale x i y są co najmniej określone w celu. w naszym przykładzie, 20x10 nie jest dobre, ponieważ skala x spadła poniżej celu (czyli 30). najbliższy będzie 30x15

Dziękuję.

Odpowiedz

11
targetRatio = targetWidth/targetHeight; 
sourceRatio = sourceWidth/sourceHeight; 
if(sourceRatio >= targetRatio){ // source is wider than target in proportion 
    requiredWidth = targetWidth; 
    requiredHeight = requiredWidth/sourceRatio;  
}else{ // source is higher than target in proportion 
    requiredHeight = targetHeight; 
    requiredWidth = requiredHeight * sourceRatio;  
} 

ten sposób Państwa ostateczny obraz:

  • zawsze pasuje wewnątrz tarczy natomiast nie są przycięte.

  • zachowuje swój oryginalny współczynnik proporcji.

  • i zawsze ma zarówno szerokość, jak i wysokość (lub obie) dokładnie pasujące do celu.

+0

Dziękuję za odpowiedź :). Potrzebuję jednak, aby zarówno szerokość, jak i wysokość zawsze pasowały do ​​części licznika docelowego lub były większe od niej. dopasowanie jest akceptowane tylko wtedy, gdy dokładnie pasuje, w przeciwnym razie powinno być większe. a kiedy jest większa, musiałem znaleźć minimalną, która jest większa, a jednocześnie zachowuje proporcje. –

+0

jesteś mile widziany, ale "zaakceptuj jako odpowiedź", jeśli jest to ten, którego oczekiwałeś. – darma

+0

Kliknąłem enter i napisałem, więc zmodyfikowałem swój komentarz. rozwiązanie jest częściowo pełne, ponieważ w niektórych przypadkach jeden z wymiarów może spaść poniżej celu. –

1

Dobrze, w swoim przykładzie, z którego korzystałeś, użyłeś algorytmu, którego szukasz. Posłużę się przykładem, który podałeś.

Original   Target 
200 x 100 -> 30 x 10 

1. You take the bigger value of the target dimensions (in our case 30) 
2. Check if its smaller than the corresponding original width or height 
    2.1 If its smaller define this as the new width (So 30 is the new width) 
    2.2 If its not smaller check the other part 
3. Now we have to calculate the height which is simply the (30/200)*100 

So as result you get like you wrote: 30 x 15 

Nadzieja to było jasne :)

W części kodującej można użyć BufferedImage i po prostu stworzyć nową BufferedImage z poprawną wartość skalę takiego.

BufferedImage before = getBufferedImage(encoded); 
int w = before.getWidth(); 
int h = before.getHeight(); 
BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
AffineTransform at = new AffineTransform(); 
at.scale(2.0, 2.0); // <-- Here you should use the calculated scale factors 
AffineTransformOp scaleOp = 
new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
after = scaleOp.filter(before, after); 
+0

Dziękuję. Sprawdzałem odpowiedź i komentarze od darmowej w moim IDE. Jest to bardzo jasne i poprawne. Dziękuję Ci bardzo. czy możliwe jest przyjęcie dwóch odpowiedzi? –

+0

Nie, nie możesz przyjąć dwóch odpowiedzi, ale możesz przyjąć oba;;). – Prine

Powiązane problemy