Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przycinanie zdjęcia (GD2)
Forum PHP.pl > Forum > PHP
deha21
Witam,
Kombinuję i kombinuję jak obciąć zdjęcie przy pomocy GD2. Szukałem na anglojęzycznych forach (bo na polskich to raczej nic nie znalazłem) i była tam mowa tylko o imagecopyresampled. Próbowałem coś z tym kombinować ale generalnie efekt był taki że mimo braku błędów nic się nie działo.
Mam oczywiście oryginalny wymiar obrazka, wymiary każdego z punktów (x1, y1, x2, y2), oraz szerokość i wysokość pola które ma zostać zachowane. Macie pomysł?
Pozdrawiam
Spawnm
Zobacz jakie parametry przyjmuje imagecopyresampled , potem pokaż jak kombinowałeś smile.gif
deha21
Właśnie nie do końca rozumiem parametry imagecopyresampled. Ogólnie kombinowałem dużo. Aktualnie mam takie coś:
  1. $th = imagecreatetruecolor($w, $h); // w i h są wielkością obrszaru który ma być zachowany
  2. imagecopyresampled($th, $img, 0, 0, $x1, $y1, $w, $h, $info[0], $info[1]); // info to szerokość i wysokość oryginalnego obrazka


Teraz niby obcina obraz od punktu x1 i y1 (czyli lewy góry punkt) ale potem już nic. Poza tym tworzy nowe wymiary obrazka, bierze je z kosmosu bo nie są to ani oryginalne ani te z obszary który ma być zachowany.
Spawnm
A czytałeś tutaj:
http://pl.php.net/manual/pl/function.imagecopyresampled.php

?
krowal
Nie bierze ich z kosmosu tylko z $w i $h, wyświetl sobie po kolei wszystkie zmienne i zobacz dokładnie co zawierają i czy zawierają to co powinny zawierać.
thek
To czytaj dokładnie opis parametrów z manuala. Poza tym zwróć uwagę jakiej funkcji używasz. Czy chcesz skopiować kawałek obrazka czy skopiować i przeskalować. Bo od tego są 3 różne funkcje (do 2 przypadku są 2 funkcje). I pamiętaj, że w GD liczenie współrzędnych obrazu jest od lewego górnego rogu! czyli współrzędne 20, 50 oznaczają, że obiekt w obrazie ma być 20px na lewo i 50px w dół od lewego górnego.
imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h ) - kopiuje wybrany fragment pliku źródłowego do wynikowego,
resource $dst_im - wskaźnik na obiekt wynikowy,
resource $src_im - wskaźnik na obiekt źródłowy,
int $dst_x - odległość od lewej w obrazie wynikowym gdzie ma być lewy górny róg kopiowanego obrazka,
int $dst_y - odległość od góry w obrazie wynikowym gdzie ma być lewy górny róg kopiowanego obrazka,
int $src_x - odległość od lewej w obrazie źródłowym kopiowanego fragmentu,
int $src_y - odległość od góry w obrazie źródłowym kopiowanego fragmentu,
int $src_w - szerokość kopiowanego fragmentu,
int $src_h - wysokość kopiowanego fragmentu.

bool imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h ) - kopiuje fragment ze źródłowego, ale dodatkowo skaluje go do odpowiedniego rozmiaru w pliku źródłowym.
int $dst_w - szerokość fragmentu w pliku docelowym,
int $dst_h - wysokość fragmentu w pliku docelowym

bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h ) - kopiuje fragment ze źródłowego, ale dodatkowo skaluje go do odpowiedniego rozmiaru w pliku źródłowym.

Różnica między 2 i 3 będzie widoczna w jakości obrazka. Zwykły resize w przypadku bogatych kolorystycznie w większości spowoduje pogorszenie ich jakości. Resampling kolorów w pewien sposób tę wadę niweluje, choć nie łudź się, że poprawisz znacząco jakość. Najlepiej sam sprawdź działanie obu na jakimś zdjęciu. innymi słowy dostajesz wybór: szybki resize, albo dokładniejszy resampling.

Przykład Twojego przykładu funkcji z opisem brzmiałby:
  1. imagecopyresampled($th, $img, 0, 0, $x1, $y1, $w, $h, $info[0], $info[1])

Z pliku źródłowego $img wyciągnij fragment zaczynający się x1 od lewej krawędzi i y1 od górnej krawędzi i mający szerokość $info[0] oraz wysokość $info[1].
Teraz weź go resampluj do szerokości $w i wysokości $h oraz umieść w obiekcie docelowym $th na pozycji 0 pikseli od lewej krawędzi i 0 pikseli od górnej krawędzi (czyli de facto w lewym górnym rogu).

Jeśli więc skopcisz parametry to logiczne, że będziesz miał cuda na obrazku winksmiley.jpg

EDIT: A teraz zagadka... Skoro pobierasz sobie z pliku źródłowego o dajmy szerokości i wysokości 600x400 fragment, który zaczyna się w 50, 20 i ma mieć szerokość 600x400 (w końcu to rozmiary oryginału a tak zadeklarowałeś w funkcji resamplującej!) to obraz w "schowku" ma wielkość 600x400 czy może 550x380 (600-50x400-20)questionmark.gif? A jeśli nie zmniejsza to co robi z pustym nadmiarowym "tłem" poza skopiowanym fragmentem obrazu źródłowego? A może jednak rozmiar fragmentu jest zmniejszany do owego 550x380 i potem jest to skalowane do $w i $h. Tyle pytań... Tyle możliwości winksmiley.jpg A wszystko zależne od zrozumienia jak działają te parametry w funkcjach tongue.gif
deha21
Cytat(Spawnm @ 4.09.2009, 12:10:19 ) *

Czytałem ale tak jak pisałem nie do końca wiem wszystko.

Był pewien problem ze skryptem któy przechwytywał x1, y1 itp. ale już jest poprawiony i dobrze wyświetla dane.
Niestety dalej jest błąd w przycinaniu. Tworzy już obraz o dobrych rozmiarach ale wygląda to tak:
Rozmiar obrazka jest dobry, tylko czarnego obszaru nie powinno tam być, natomiast ten kolorowy powinien być rozciągnięty na całość

Dzięki, przeanalizowałem twój post i doszedłem do wniosku że powinno być tak
  1. imagecopyresampled($th, $img, 0, 0, $x1, $y1, $w, $h, $w, $h);

I działa jak należy biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.