Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 28.06.2010 Ostrzeżenie: (0%)
|
Witam,
czy istnieje jakiś sposób aby kadrować zdjęcia o określonym wymiarze od środka? A mianowicie skrypt znajduje srodek zdjecia a nastepie kadruje? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
Nie no... Matma się kłania i to na poziomie proporcji poznawanych w 5 klasie podstawówki na oko oraz dodawania i odejmowania na poziomie 1 klasy podstawówki.
Bierzesz rozmiar wynikowy. Liczysz wielokrotność boku między oryginałem i wynikowym. Tam gdzie jest mniejsza liczba nastąpi przypisanie. Potem musisz policzyć z tym samym stopniem skalowania rozmiar drugiego rozmiaru dla oryginału, odjąć ten rozmiar od całej długości boku i ową wielkość podzielić przez 2, co wskaże miejsce kadrowania. Przykład: Oryginał 800 x 765 Kadr: 200 x 300 800(oryg)/200(kadr) = 4 765(oryg)/300(kadr) = 2,55 Bierzemy 765(wysokość oryginału) i obliczamy 200(szerokość kadru - przeciwległy do wybranego wymiar)*2,55 = 510 (800-510)/2 = 290 / 2 = 145 (miejsce rozpoczęcia kadrowania dla przeciwległego boku do wybranego) A więc używamy imagecopyresampled gdzie z oryginału wyciągamy fragment o współrzędnych startu 145,0 i parametrach 510 x 765 po czym wtłaczamy do 200 x 300 Teraz te same dane, ale kadr "odwrócony": Oryginał 800 x 765 Kadr: 300 x 200 800(oryg)/300(kadr) = 2,66 765(oryg)/200(kadr) = 3,825 Bierzemy 800 (szerokość oryginału) i obliczamy 200(wysokość kadru - przeciwległy do wybranego wymiar)*2,66 = 533,333 ~= 533 (765-533)/2 = 232 / 2 = 116 (miejsce rozpoczęcia kadrowania dla przeciwległego boku do wybranego) A więc używamy imagecopyresampled gdzie z oryginału wyciągamy fragment o współrzędnych startu 0,116 i parametrach 800 x 533 po czym wtłaczamy do 300 x 200 Popatrz jak zmieniło mi się wyliczanie. Raz mniejsza proporcja na szerokości, raz na wysokości, co zmieniło współrzędne dla kadrowania... Raz było 0,x a innym x,0. Popatrz na algorytm i pisz, bo funkcjami Ci tego okładać nie mam zamiaru. Czas na Twój ruch, a nie czekanie na gotowca. P.S.: Oczywiście to jest kadrowanie obrazu do określonego wynikowego ze skalowaniem całego obrazu do kadru wynikowego. Musisz też sprawdzić, czy aby któryś z wymiarów kadru nie jest większy od oryginału. Wyjdzie to przy skalowaniu... Te większe będą miały proporcję mniejszą niż 1. W takich wypadkach kod nieco się zmieni i będziesz musiał "dokładać" puste miejsce po bokach. Zostawiam Ci ten ostatni przypadek do samodzielnego przemyślenia. Najważniejsze w tym przypadku jest przemyślenie, który bok będzie uznany za ten, służący do wyliczenia proporcji dla drugiego. No i nieco inaczej będzie wyglądało wywołanie imagecopyresampled (IMG:style_emoticons/default/smile.gif) Parametry bowiem będą ciut inaczej wyliczone. Tu będzie konieczne więcej obliczeń. No chyba, że mowa o zwykłym kopiowaniu fragmentu obrazu do wyniku bez przeskalowywania. Wtedy sprawa się mocno upraszcza. Ale zwykłe kadrowanie bez przeskalowywania odrób jako zadanie domowe z użyciem wspomnianej przez wookiego funkcji (IMG:style_emoticons/default/smile.gif) EDIT: Zauważ, że istnieją 3 warianty kadrowania ze skalowaniem: - oba wymiary oryginału są większe niż w kadrze (kadrowanie z pomniejszaniem) - oba wymiary oryginału są mniejsze niż w kadrze (kadrowanie z powiększaniem) - jeden z wymiarów oryginału jest mniejszy niż w kadrze (specyficzny przypadek pomniejszania z kadrowaniem ) Musisz je rozpoznać i odpowiednio zareagować.
Powód edycji: [thek]: Mała uwaga...
|
|
|
|
zerosix [PHP] Kadrowanie zdjęc do środka. 30.06.2010, 07:52:59
wookieb Tak istnieje. Musisz tylko wyliczyć parametry.
htt... 30.06.2010, 08:24:08
zerosix dzieki za wyczerpujaca odpowiedz,bede dłubał 30.06.2010, 10:02:08
celbarowicz wiem, że nie na temat. w razie rozpaczy możesz zr... 30.06.2010, 11:06:05
MrNeo Witam i przepraszam, że odkopuję stary temat ale m... 12.07.2013, 11:24:42 ![]() ![]() |
|
Aktualny czas: 8.04.2026 - 12:01 |