Kilka dni temu trafiłem na pytanie o pomoc w przeskalowaniu obrazka do uploadu na pewnej stronie internetowej. Pomyślałem sobie: „kurczę, znowu ktoś nie umie takich podstawowych rzeczy”, aczkolwiek w opisanych wymaganiach znalazły się nie tylko informacje na temat docelowego rozmiaru, ale także rozdzielczości. Nauczony doświadczeniem zasugerowałem, żeby ten ostatni parametr zostawić w spokoju, ponieważ „i tak go nie sprawdzą”. W odpowiedzi dostałem jednak informację, że właśnie dlatego próby samodzielnej zmiany wymiarów nie przechodzą walidacji formularza. Stwierdziłem, że warto będzie zobaczyć, w jaki sposób można sprawdzić taki parametr na własną rękę.
Fotografia: kevindooley, CC-BY.
PHP: Sprawdzanie rozdzielczości pliku graficznego.
Pierwsze kroki skierowałem ku manualowi biblioteki GD, jako, że jest to najczęściej wykorzystywanej przeze mnie narzędzie do manipulacji obrazami w PHP. Niestety, co potwierdzają także źródła internetowe, GD nie posiada funkcji pozwalających na odczytanie rozdzielczości załadowanego pliku.
Trzeba było zatem poszukać czegoś innego. PHP nie należy do języków, które posiadają specjalnie bogaty wachlarz rozwiązań pozwalających na przetwarzanie obrazów, także jeśli nie GD, to zostaje właściwie tylko ImageMagick. Tylko i aż, ponieważ jest to chyba jedna z najbardziej rozpoznawalnych bibliotek tego typu.
ImageMagick udostępnia dwie „samodokumentujące się” metody:
Zobaczmy więc, jak wykorzystać je w praktyce.
Pobieranie rozdzielczości:
$image = new Imagick('image.png');
$resolution = $image->getImageResolution();
W zmiennej $resolution zostanie zapisana tablica z dwoma wartościami – rozdzielczością pionową i poziomą.
Ustawianie rozdzielczości:
$image = new Imagick('image.png');
$image->setImageResolution($resX, $resY);
Zmienne $resX i $resY określają rozdzielczość pionową i poziomą – należy podać odpowiednie liczby, ImageMagick zajmie się za nas resztą.
Tyle na dzisiaj, dziękuję za lekturę wpisu. Do zobaczenia w niedzielę. ;]
Warto przeczytać.
Trwa ładowanie…
co będzie w niedzelę? ;)
http://php.net/manual/en/function.getimagesize.php
A nie prościej skorzystać z [url=http://php.net/manual/en/function.getimagesize.php]getimagesize()[/url]?
A nie lepiej skorzystać z [url=http://php.net/manual/en/function.getimagesize.php]getimagesize()[/url]?
Sprecyzuj może bardziej, bo wiele osób myli pojęcie. Masz na myśli wymiary obrazu (width, height) czy faktyczna rozdzielczość (dpi) ? To pierwsze jest – getimagesize, to drugie to cuda wianki bo natywnie jest chyba zawsze 72 z góry i niejako niezmiennie. Tyle że już czytałem, iż da się to obejść, ale wymaga to kombinowania z rozmiarem obrazu.
@tytan: W niedzielę, jak zawsze, będzie Linkdump – zajrzyj do Harmonogramu [pozycja w górnym menu]: http://blog.kowalczyk.cc/harmonogram/ , a będziesz na bieżąco.
PHP: Sprawdzanie rozdzielczości pliku graficznego.
@murwazy, @Jacek Smolak: Nie miałem na myśli wymiarów obrazu – nie pisałbym wpisu o czymś aż tak prostym. Poza tym jak sami zauważyliście to da się zrobić w GD, nie trzeba Imagicka.
PHP: Sprawdzanie rozdzielczości pliku graficznego.
@thek: Faktycznie – dla mnie było oczywiste, że rozdzielczość obrazka to co innego niż jego wymiary. Niniejszy wpis traktuje o rozdzielczości [dpi], dlatego napisałem, że nie da się tego zrobić w GD, bo tylko Imagick ma potrzebne funkcje.
W pewnym sensie masz rację, że rozdzielczość to takie „cuda wianki”, bo prawdopodobnie większość prostych edytorów graficznych ignoruje ten parametr albo ustawia ją na jakąś sztywną wartość [np. Paint na 72dpi]. Bardziej zaawansowane narzędzia jednak pozwalają ustawić odpowiednie wartości, a także zachować już istniejące. Wiadomo, że próba zmiany rozdzielczości może być karkołomnym zadaniem, bo Imagick też nie jest jakimś specjalnie „zaawansowanym edytorem”, ale odczytywanie jej powinno być przydatną funkcją biblioteki.
PHP: Sprawdzanie rozdzielczości pliku graficznego.
Żeby nieco wspomóc, to te pytanie (właściwie jego komentarze) może nieco powiedziec o co chodzi z „cuda wianki” przy GD i wysokich dpi :)
A tutaj już nieco „ładniej” opisane dlaczego mamy zawsze 72(96 zależnie od kompilacji biblioteki) dpi i jak próbowac to ugryźć :)
http://www.andreyvoev.com/programming/change-the-dpi-of-a-jpeg-image-with-php/
Mam nadzieję, że nie obrazi się imiennik, że to kolejny link mój, jeden pod drugim. Najwyżej złącz oba, a jeden wywal ;)
Nie do końca rozumiem, co chciałeś przekazać w pierwszym z tych dwóch komentarzy – jeśli mógłbyś trochę rozjaśnić, byłoby bardzo miło.
Co do drugiego – dzięki za link, jest to trochę „niskopoziomowe” podejście, ale oczywiście skuteczne, także w razie czego można się posłużyć i nim. Nie potrzeba wtedy żadnych bibliotek. ;]
PHP: Sprawdzanie rozdzielczości pliku graficznego.
Wcięło mi w nim adres url: Nie wiem czy przeglądarka wycięła czy coś po stronie bloga, ale link -> http://bytes.com/topic/php/answers/5948-dpi-php-gd <- jeszcze raz podam, teraz między strzałkami by sprawdzić czy tym razem zahula :)
Ok, jasne. ;] Nie widziałem linka w komentarzu, więc musiał zostać wycięty przez WordPressa.
PHP: Sprawdzanie rozdzielczości pliku graficznego.
A dlaczego nie możesz użyć funkcji getimagesize?
Czytaj komentarze, Marku. ;] Funkcja getimagesize() zwraca wymiary obrazka [w pikselach], nie jego rozdzielczość [w dpi]. Dlatego nie mogę użyć ani tej funkcji, ani biblioteki GD w ogólności.
PHP: Sprawdzanie rozdzielczości pliku graficznego.