Pytanie Algorytm zmiany rozmiaru obrazu


Chcę napisać funkcję zmniejszania rozmiaru obrazu w celu dopasowania do określonych granic. Na przykład chcę zmienić rozmiar obrazu 2000x2333, aby zmieścił się w rozdzielczości 1280x800. Współczynnik proporcji musi być zachowany. Wymyśliłem następujący algorytm:

NSSize mysize = [self pixelSize]; // just to get the size of the original image
int neww, newh = 0;
float thumbratio = width / height; // width and height are maximum thumbnail's bounds
float imgratio = mysize.width / mysize.height;

if (imgratio > thumbratio)
{
    float scale = mysize.width / width;
    newh = round(mysize.height / scale);
    neww = width;
}
else
{
    float scale = mysize.height / height;
    neww = round(mysize.width / scale);
    newh = height;
}

I wydawało się, że działa. Cóż ... wydawało się. Ale potem próbowałem zmienić rozmiar obrazu 1280x1024 na 1280x800, co dało mi wynik 1280x1024 (co oczywiście nie mieści się w 1280x800).

Czy ktokolwiek ma pomysły, jak ten algorytm powinien działać?


9
2017-07-26 04:39


pochodzenie




Odpowiedzi:


Sposób, w jaki zwykle to robię, to spojrzenie na proporcję między oryginalną szerokością a nową szerokością i proporcją między oryginalną wysokością a nową wysokością.

Po tym zmniejszanie obrazu o największy współczynnik. Na przykład, jeśli chcesz zmienić rozmiar obrazu o wymiarach 800x600 na obraz 400 x 400, stosunek szerokości będzie wynosił 2, a stosunek wysokości będzie wynosił 1,5. Zmniejszenie obrazu o współczynnik 2 daje obraz 400x300.

NSSize mysize = [self pixelSize]; // just to get the size of the original image
int neww, newh = 0;
float rw = mysize.width / width; // width and height are maximum thumbnail's bounds
float rh = mysize.height / height;

if (rw > rh)
{
    newh = round(mysize.height / rw);
    neww = width;
}
else
{
    neww = round(mysize.width / rh);
    newh = height;
}

26
2017-07-26 04:47



Oh, powinienem dodać dla przykładu przykładowy współczynnik od 1280x1024 do 1280x800, a proporcje będą wynosić 1 i 1,28, po zmianie rozmiaru będzie to 1000 x 800 - GWW
Dziękuję Ci! Myślę, że w końcu to działa! - Marius


Oto sposób podejścia do problemu:

Wiesz, że albo wysokość, albo szerokość obrazu będzie równa szerokości obwiedni.

Po ustaleniu, który wymiar jest równy polu granicznemu, do obliczenia innego wymiaru użyj współczynnika proporcji obrazu.

double sourceRatio = sourceImage.Width / sourceImage.Height;
double targetRatio = targetRect.Width / targetRect.Height;

Size finalSize;
if (sourceRatio > targetRatio)
{
    finalSize = new Size(targetRect.Width, targetRect.Width / sourceRatio);
}
else
{
    finalSize = new Size(targetRect.Height * sourceRatio, targetRect.Height);
}

7
2018-03-13 23:44



Czym jest imageRatio? - Jonathan Aquino
@ Jonathan Aquino Myślę, że tak powinno być sourceRatio. Dobry odbiór. - Andrew Shepherd