BAZA WIEDZY
KURSY
Bazy danych w PHP
Kurs AdvancedAJAX
Kurs ASP
Kurs ASP.NET
Kurs C++
Kurs CSS
Kurs HTML
Kurs HTML drugi
Kurs JavaScript
Kurs MySQL
Kurs PHP
Kurs RSS
Kurs XHTML
Obiekty DOM
MANUALE
CSS1 - W3C
DOM - w budowie
PHP 2005
PHP 2006
Wyrażenia regularne
SHOUTBOX
STAT
Online: 21 | UU: 433
[PHP] Tworzenie miniaturek - zmiana wielkości obrazów w php
19 kwiecień 2007

W tej poradzie przedstawię w jaki sposób wykorzystać język php do manipulacji obrazem. Konkretnie zajmiemy się zmianą wielkości plików graficznych. Przedstawiona funkcja może zostać zastosowana w galeriach zdjęć do tworzenia miniaturek. Dodatkowo przedstawiony skrypt umożliwi dobór wielkości miniaturek do własnych wymagań.

Najpierw zastanówmy się jaki rozmiar ma mieć nasz docelowy obrazek. Istnieją dwa przypadki. Pierwszy, w którym orginalny obrazek jest większy od docelowego i drugi, w którym chcemy, aby obrazek docelowy był większy niż orginalny. Zmiejszanie obrazka nie stanowi problemu tak jak zwiększanie, którego efektem może być utrata jakości.

Użyjemy funkcję PHP korzystającą z biblioteki GD2. Jest to świetne rozwiązanie, jednak aby go użyć należy taką bibliotekę włączyć.

Aby włączyć możliwośc korzystania z biblioteki GD2 otwórz plik php.ini:
Aby uzyskać informację gdzie się ten plik znajduje możesz stworzyć mały skrypt informacyjny: <?php phpinfo(); ?>
Znajdź "extension_dir" i ustaw na właściwą wartość. Przykład: extension_dir = "d:\Program Files\Php\extensions\". Włącz bibliotekę GD2. Znajdź "extension=php_gd2.dll" i usuń semicolon(;) na początku linii. Sprawdź ustawienia za pomocą <?php phpinfo(); ?>. Powinieneś zauważyć sekcję GD Support" enabled.

Teraz zajmijmy się napisaniem odpowiedniego skryptu. Stórzmy funkcję o nazwie resizeImage(). Funkcja będzie posiadać 3 parametry: orginalny obrazek, docelowa szerokość, docelowa wysokość.

Kod: php

<?php
function resizeImage($orginalny_obrazek,$docelowa_szerokosc,$docelowa_wysokosc){
}
?> 

Aby wiedzieć do jakiego rozmiaru zmniejszyć obrazek musimy znać parametry orginalego obrazka. Możemy je pobrać za pomocą gotowej funkcji getimagesize(), która pobiera rozmiar obrazków w formatach GIF, JPG, PNG, SWF, SWC, PSD, TIFF, BMP, IFF, JP2, JPX, JB2, JPC, XBM lub WBMP i zapisuje w tablicy.

Przykład:

Kod: php

<?php
    // Pobranie rozmiaru
    list($szerokosc, $wysokosc) = getimagesize($orginalny_obrazek);
    $xskala=$szerokosc/$docelowa_szerokosc;
    $yskala=$wysokosc/$docelowa_wysokosc;

?> 

Powyższy skrypt pozwoli nam skalkulować do jakiego rozmiaru chcemy doprowadzić nowy obraz. Przeanalizujmy dalszą część:

Kod: php

<?php
    // Kalkulacja nowego rozmiaru
    if ($yskala>$xskala){
        $nowa_szerokosc = round($szerokosc * (1/$yskala));
        $nowa_wysokosc = round($wysokosc * (1/$yskala));
    }
    else {
        $nowa_szerokosc = round($szerokosc * (1/$xskala));
        $nowa_wysokosc = round($wysokosc * (1/$xskala));
    }
?> 

Mamy teraz wszystkie potrzebne informacje, więc przejdźmy do sedna sprawy. Użyjemy 3 funkcji. Najpierw stwórzymy obraz o nowych rozmiarach używając funkcji imagecreatetruecolor(). Następnie stworzymy tymczsowy obraz. Zastosujemy w tym przypadku funkcję imagecreatefromjpeg(), która stworzy nowy obraz ze ścieżki do pliku. Na koniec najważniejsza sprawa. Tutaj użyjemy funkcji imagecopyresampled(), która skopiuje i zmieni rozmiar obrazu.

Kod: php

<?php
    // Zmiana rozmiaru orginalnego obrazu
    $obraz_zmiana_wielkosci = imagecreatetruecolor($nowa_szerokosc, $nowa_wysokosc);
    $obrazek_tymczasowy     = imagecreatefromjpeg ($orginalny_obrazek);
    imagecopyresampled($obraz_zmiana_wielkosci, $obrazek_tymczasowy, 0, 0, 0, 0, $nowa_szerokosc, $new_wysokosc, $szerokosc, $wysokosc);
?> 

Na koniec uzyskamy nowy obrazek. Konpletna funkcja zmiany rozmiaru wygląda tak:

Kod: php

<?php
function zmiana_rozmiaru($orginalny_obrazek,$docelowa_szerokosc,$docelowa_wysokosc){
   
    // Pobranie orginalnych parametrów i kalkulacja skali
    list($szerokosc, $wysokosc) = getimagesize($orginalny_obrazek);
    $xskala=$szerokosc/$docelowa_szerokosc;
    $yskala=$wysokosc/$docelowa_wysokosc;
   
    // Kalkulacja nowego rozmiaru
    if ($yskala>$xskala){
        $nowa_szerokosc = round($szerokosc * (1/$yskala));
        $nowa_wysokosc = round($wysokosc * (1/$yskala));
    }
    else {
        $nowa_szerokosc = round($szerokosc * (1/$xskala));
        $nowa_wysokosc = round($wysokosc * (1/$xskala));
    }

    // Zmiana rozmiaru orginalnego obrazu
    $obraz_zmiana_wielkosci = imagecreatetruecolor($nowa_szerokosc, $nowa_wysokosc);
    $obrazek_tymczasowy     = imagecreatefromjpeg ($orginalny_obrazek);
    imagecopyresampled($obraz_zmiana_wielkosci, $obrazek_tymczasowy, 0, 0, 0, 0, $nowa_szerokosc, $nowa_wysokosc, $szerokosc, $wysokosc);

    return $obraz_zmiana_wielkosci;
}
?>

Dodaj komentarz









Komentarze
29 odpowiedzi
25 maj 2012, godz. 12:13

Cz jest możliwość by zmieniał obrazki w locie ?
Bez zapisywania na dysk.

vgjj
5 listopad 2010, godz. 5:58

rewelacja jak komuś nie zapisuje na serwerze to:

$obraz_zmiana_wielkosci = zmiana_rozmiaru(’wyslane/’.$plik_nazwa, $nowa_szerokosc, $nowa_wysokosc);

//zapisywanie zdjecia na serwerze
ImageJPEG($obraz_zmiana_wielkosci, $lokalizacja);

ed
20 październik 2010, godz. 11:22

Witam też mam czarny prostokąt po wgraniu na serwer… Czy ktoś wie o co chodzi??

tomek
28 czerwiec 2010, godz. 5:53

zamiast miniaturek na serwer wgrywa czarny prostokacik, ktos wie o co chodzi ??

11 czerwiec 2010, godz. 9:16

Działa tylko dla .jpg dla gifa nalezy zastosować imagecreatefromgif

9 maj 2010, godz. 11:40

Przydałoby się wysyłanie headera odpowiedniego :)

Ralf
7 maj 2010, godz. 10:30

Skrypt działa bez zarzutów.
Wielkie dzięki, stary ^^

Zibi
15 styczeń 2010, godz. 7:34

Poradziłem sobie jakoś, jeśli kogoś interesuje to skopiowałem jeszcze raz ten sam plik do folderu gdzie jest skrypt, po czym go z stamtąd usunąłem. ;)

Zibi
15 styczeń 2010, godz. 12:10

Witam, mam takie pytanko, czy jest możliwe utworzenie miniatury z jakiegoś innego folderu , nie tego w którym znajduje się ten skrypt?

Maniek
10 listopad 2009, godz. 5:45

A jak go zapisać do mysql bez zapisywania na dysk?

kamil
17 sierpień 2009, godz. 9:17

udalo sie komus zarejestrowac na anonseo ???bo ja cos nie moge czekam na maila i nic :(:(

Matt
19 marzec 2009, godz. 6:59

moon, bo funkcja imagecreatefromjpeg rozpakowywuje .jpegi i wtedy 400 KB obrazek moze ze 13 MB wazyc nawet.

Co zrobić żeby to naprawić?

jskdn
11 luty 2009, godz. 2:11

jak zmienić powyższy skrypt zeby podczas ładowania zdjęcia wrzucać zdjecia do katalogu i tworzyć dla nich miniaturki.

14 październik 2008, godz. 6:20

wood canada mail stay ocean no house

Skorp
18 czerwiec 2008, godz. 8:29

moon, bo funkcja imagecreatefromjpeg rozpakowywuje .jpegi i wtedy 400 KB obrazek moze ze 13 MB wazyc nawet.

moon
10 czerwiec 2008, godz. 12:32

Miniaturki są ok, jednak zmniejszając w ten sposób obrazek z 1024 do 860 ten pomniejszony waży więcej niż oryginał :/ Ktoś wie dlaczego?

8 maj 2008, godz. 7:08

mysle, ze warto by bylo napisac, jak zapisac taka miniaturke, i pozniej zeby skrypt sprawdzal czy dla danego obrazu jest juz miniaturka, zeby przy kazdym wchodzeniu na strone server nie obciazal sie zmiana wielkosci .jpga

noryx
3 maj 2008, godz. 5:37

Aby wyświetlić obrazek i zapisać go na dysku należy użyć funkcji:
imagejpg($obraz_zmiana_wielkosci, ścieżka, jakość).

Proponowałbym również zwolnienie zasobów serwera poprzez użycie funkcji imagedestroy():
imagedestroy($obraz_zmiana_wielkosci)
i
imagedestroy($obrazek_tymczasowy)

28 kwiecień 2008, godz. 1:51

Nie działa…

KTK
13 kwiecień 2008, godz. 8:49

Jestem poczatkujacy, i mam male pytanie. wszytsko ladnie pieknie, tylko jak na koncu sprawic zeby zmniejszony obrazek pokazal sie na ekrenie bo chyba wydrukowanie echo “

robson
23 marzec 2008, godz. 2:47

Lipa. Po co komu funkcja która potrafi jedynie zmieniać rozmiar pliku jpg.
Juz lepiej piszcie sam algorytm.

morphes
16 marzec 2008, godz. 1:08

“oryginalny”, jak cos… polska jezyk trudna jezyk

duży
28 luty 2008, godz. 6:20

Coś mi nie chce działać… :(

hehe
16 listopad 2007, godz. 7:20

A dlaczego Bogdan mowi bankowy?

20 sierpień 2007, godz. 1:49

działa super :)

niemal
22 lipiec 2007, godz. 12:56

Już wiem jako np jpg

ImageJPEG($obraz_zmiana_wielkosci,$file_location);

niemal
22 lipiec 2007, godz. 12:21

A jak to zapisać na serwerze?

ronald
24 czerwiec 2007, godz. 1:27

Nie wiem, zapytam tych z Zend

Capellini
24 czerwiec 2007, godz. 12:53

A dlaczego te funkcje imagecreatetruecolor itd. mają takie długie nazwy?

 
 
Copyright © 2006-2011 egrafik.pl | Kontakt | Reklama | Projekty domów
jocker