Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Kadrowanie zdjęc do środka.
zerosix
post
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
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...
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.04.2026 - 12:01