Temat wykladu:
PHP: Biblioteka GD: generowanie grafiki w PHP (by Michu, 2007-11-14) @ wyklady.net
Komentarze: http://forum.wyklady.net/index.php?topic=121.0
20:39Michuwitam wszystkich na wykladzie o bibliotece GD w php
20:39Michusłuży ona do generowania grafiki w php
20:40Michujak sprawdzic czy nasz serwer obsługuje GD
20:40Michujest na to bardzo prosty sposób
20:40Michuwpisujemy
20:40Michu<?php
20:40Michuinfo();
20:40Michu?>
20:40Michui w jednej z kolumn powinna być informacja o bibliotekach GD
20:41Michujezeli
20:41Michumamy te biblioteki
20:41Michuto mozemy zacząc pisac nasz pierwszy skrypt
20:41Michubedze on generował
20:41Michuobraz png
20:41Michuot jego kod
20:42Michu<?php
20:42Michuheader("Content-type: image/png");
20:42Michu$obrazek = @imagecreate(200, 30)
20:42Michuor die( "Nie można zainicjować strumienia GD" );
20:42Michu$kolor_tla = imagecolorallocate ( $obrazek, 255, 255, 255 );
20:42Michu$kolor_tekstu = imagecolorallocate ( $obrazek, 0, 0, 0 );
20:42Michuimagestring ( $obrazek, 5, 10, 10, "Hello PHP_GD!", $kolor_tekstu );
20:42Michuimagepng ( $obrazek );
20:42Michuimagedestroy( $obrazek );
20:42Michu?>
20:42Michuto zacznijmy go analizowac
20:42Michuby dowiedziec sie co on robi
20:42Michu2 linijka
20:42Michuzawiera funkcje header()
20:43Michuprzekazuje ona w tym wypadku informacje jakei
20:43Michurozszerzenie bedze miał plik
20:43Michuktóry generujemy
20:43Michuczyli png
20:43Michu3 linijka
20:43Michutworzy obrazek
20:43Michu200 na 30 px
20:43Michu@ przed funkcją powoduje
20:43Michuiz w razie błędu
20:44Michubłąd nie zostanie wyświetlony
20:44Michu4 linijka
20:44Michupoprostu mówi co ma się stać gdy 3 nie zadziała
20:44Michu5 linijka ustala kolor tła
20:45Michusłuży do tego funkcje imagecolorallocate()
20:45Michujako pierwszy parametr podajemy
20:45Michuzmienna gdzie jest obrazek
20:45Michupotem kolor
20:45Michutu za pomoca nasycenia danego z kolorów
20:45Michuod 0 do 255
20:45Michu6 linijka
20:46Michuodpowiada za kolor tekstu
20:46Slim[;
20:46Michutu tak samo 1 warosc to zmienna obrazka a pozoastałe to nasycenie kolorów
20:46Michuhttp://wellstyled.com/tools/colorscheme/index-en.html
20:46Michuto jest strona na której mozemy pobawić ise z nasyceniem
20:46Michupodajemy od 0 do 255 nasycenie koloru
20:47Michuteraz nastepna linijka
20:47Michutworzy ona obrazek
20:47Michu1 zmienna to obrazek
20:47Michu3 liczby to położenie obrazka
20:47Michupotem jest wyświetlany tekst
20:48Michua potem jego kolor
20:48Michunastepna linijka wywołuje obrazek do png
20:48Michua ostatnia niszczy obrazek
20:48Michumam nadzieje ze omówiłem wszystko dokładnie
20:48JaBoJaSugestia: Lepiej daj header() za ewentualnymi komunikatami o błędzie, bo inaczej dostaniesz tekst wysłany jako obrazek.
20:48Michujezeli są pytania to prosze pisac
20:49lidiachyba brak
20:49Michuteraz zrobimy to samo
20:49Michuale do jpg a nie do png
20:49Michujak wiadomo jpg jes to to format mocno skapresowany
20:49Michuoto kod
20:50Michuheader("Content-type: image/jpeg");
20:50Michu$obrazek = @imagecreate(400, 300)
20:50Michuor die( "Nie można zainicjować strumienia GD" );
20:50Michu$kolor_tla = imagecolorallocate ( $obrazek, 255, 255, 255 );
20:50Michu$kolor_tekstu = imagecolorallocate ( $obrazek, 0, 0, 0 );
20:50Michuimagestring ( $obrazek, 5, 20, 150, "Hello PHP_GD", $kolor_tekstu );
20:50Michuimagejpeg ( $obrazek );
20:50Michuimagedestroy( $obrazek );
20:50Michuwszystko zostało omówione wcześniej wiec nie bede znów analizował kodu
20:50Michuwidać ze zmienił ise nagłówek czyli header
20:50Michuz png
20:51Michuna jpg
20:51Michui przed ostatnia linia z imagepng
20:51Michuna imagejpg
20:51Michuale do czego to przydatne
20:51Michunajcześciej do tokenow
20:52Michuktore sa juz troche przestarzale
20:52Michuale nadal sie jes spotyka
20:52Michujest cos bardziej praktycznego
20:52Michumianowicie tworzenie miniaturek
20:52Michuzdjec
20:52Michuprzydatne jak mamy serwis ze zdjeciami
20:53Michuoto jego kod
20:53Michu<?php
20:53Michuheader("Content-type: image/jpeg");
20:53Michuclass Obrazek {
20:53Michuprivate $obrazek;
20:53Michu
20:53Michufunction __construct ( $sciezka_pliku_jpg ) {
20:53Michu$this->obrazek = @imagecreatefromjpeg( $sciezka_pliku_jpg )
20:53Michuor die( "Nie można zainicjować strumienia GD" );
20:53Michu}
20:53Michufunction destruct() {
20:53Michuimagedestroy ( $this->obrazek );
20:53Michu}
20:53Michupublic function resize ( $tbx , $tby ) {
20:53Michu$ow = imagesx($this->obrazek);
20:53Michu$oh = imagesy($this->obrazek);
20:53Michu$mid['ow'] = $tbx;
20:53Michu$mid['oh'] = $tby;
20:53Michuif ( $ow > $oh and $mid['oh'] > $oh) {
20:53Michu$mid['width'] = $mid['ow'];
20:53Michu$mid['height'] = $oh/$ow * $mid['ow'];
20:53Michu$mid_pot['width'] = 0;
20:53Michu$mid_pot['height'] = ($mid['oh'] - $mid['height']) / 2;
20:53Michu} else {
20:54Michu$mid['height'] = $mid['oh'];
20:54Michu$mid['width'] = $ow/$oh * $mid['oh'];
20:54Michu$mid_pot['height'] = 0;
20:54Michu$mid_pot['width'] = ($mid['ow'] - $mid['width']) / 2;
20:54Michu}
20:54Michu$tb = imagecreatetruecolor ( $mid['ow'], $mid['oh'] );
20:54Michuimagecopyresized ( $tb , $this->obrazek , $mid_pot['width'],
20:54Michu$mid_pot['height'], 0, 0,
20:54Michu$mid['width'], $mid['height'], $ow, $oh );
20:54Michureturn $tb;
20:54Michu}
20:54Michu}
20:54Michu$obiektObrazka = new Obrazek ( "wakacje.jpg" );
20:54Michuimagejpeg ( $obiektObrazka->resize (160, 90) );
20:54Michu?>
20:54Michuczy mam omawiac ten kod
20:54Michuczy funkcjie sa znane
20:54Michu?
20:54Michuwiec omówie ostatnie linijki
20:54Michugdzie sa funkcje GD
20:54Michufunkcja
20:54Michuimagecopyresized
20:55Michuzmiejsza obrazek do podanych wartości
20:55Michuczyli $mid['ow'] i $mid['oh']
20:55Michuurzywanie tej klasy jest proste
20:56Michutworzac klase podajemy nazwe zdjecia
20:56Michua potem tylko podajemy do jakich wielkosci mamy je zmiejszyc
20:56phini[~phini@unarted.human] has left #wyklady: <>
20:56Michuczy jest wszystko zrozumiałe
20:56Michu?
20:57Michujezeli tak ot przejde do omawiania funkcji w GD
20:57Michuzaczniemy od funkcji getimagesize
20:57Michupodaje ona wielkosc obrazka
20:58Michuoto przyklad
20:58Michu<?php
20:58Michu$size = getimagesize($filename);
20:58Michu$fp = fopen($filename, "rb");
20:58Michuif ($size && $fp) {
20:58Michuheader("Content-type: {$size['mime']}");
20:58Michufpassthru($fp);
20:58Michuexit;
20:58Michu} else {
20:58Michu// error
20:58Michu}
20:59Michualbo prosstrzyy pprzyklad
20:59Michu<?php
20:59Michulist($width, $height, $type, $attr) = getimagesize("img/flag.jpg");
20:59Michuecho "<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";
20:59Michu?>
20:59Michumozna sprawdzic jaki da ona wynik
20:59Michupoda wielkosc obrazka
21:00Michutu podam przyklad tworzenia prezentacji danych w GD
21:00Michu<?php
21:00Michuheader("Content-type: image/jpeg");
21:00Michuclass Wykres {
21:00Michuprivate $dane;
21:00Michuprivate $tytul;
21:00Michufunction __construct( $tytul, $tablica_danych ) {
21:00Michu$this->tytul = $tytul;
21:00Michu$this->dane = $tablica_danych;
21:00Michu}
21:00Michupublic function wyswietl () {
21:00Michu$szerokosc = count($this->dane)*30+10;
21:00Michu$wysokosc = max($this->dane)+50;
21:00Michu$wykres = @imagecreate( $szerokosc , $wysokosc )
21:00Michuor die( "Nie można zainicjować strumienia GD" );
21:01Michu$kolor_tla = imagecolorallocate ( $wykres, 255, 255, 255 );
21:01Michu$kolor_czcionki = imagecolorallocate ( $wykres, 0, 0, 0 );
21:01Michu$od_lewej = 10;
21:01Michuforeach ($this->dane as $key => $value) {
21:01Michu$kolor = imagecolorallocate ( $wykres,
21:01Michurand(0,230), rand(0,230), rand(0,230) );
21:01Michuimagefilledrectangle ( $wykres, $od_lewej, $wysokosc-30,
21:01Michu$od_lewej+20, $wysokosc-$value-30, $kolor );
21:01Michuimagettftext ( $wykres, 8, 45, $od_lewej, $wysokosc-2,
21:01Michu$kolor_czcionki, "plik-font2.ttf", $key );
21:01Michuimagettftext ( $wykres, 8, 0,
21:01Michu$od_lewej+2, $wysokosc-$value-35,
21:01Michu$kolor_czcionki, "plik-font2.ttf", $value );
21:01Michu$od_lewej = $od_lewej + 30;
21:01Michu}
21:01Michuimagettftext ( $wykres, 10, 0, 10, 20,
21:01Michu$kolor_czcionki, "plik-font2.ttf", $this->tytul );
21:01Michuimagepng ( $wykres );
21:01Michuimagedestroy ( $wykres );
21:01Michu}
21:01Michu}
21:01Michu$tablica_danych = array (
21:01Michu'2003' => 100,
21:01Michu'2004' => 30,
21:01Michu'2005' => 50,
21:01Michu'2006' => 78,
21:01Michu'2007' => 130,
21:01Michu'2008' => 290
21:02Michu);
21:02Michu$obiektWykresu = new Wykres ( "Wielkość sprzedaży\n- dane z regionów", $tablica_danych );
21:02Michu$obiektWykresu->wyswietl();
21:02Michu?>
21:02Michupokazuje ona wykles sprzedazy
21:02Michudzieki gd
21:02Michumozemy dac na stone
21:02Michuwykresy
21:02Michuzamiast suchych liczb
21:02Michujak dotad tworzylismy
21:02Michunowe obrazy a spróbujmy
21:02Michubazować na innym służa do tego specjalne funkcj
21:02Michue
21:03Michuimagecreatefrom{tu nazwa rozszezenia}
21:03Michuczyli np. imagecreatefromgif, imagecreatefromjpeg
21:03Michuitd
21:03Michuto przyklad do tego
21:04Michu<?php
21:04Michufunction LoadGif ($imgname)
21:04Michu{
21:04Michu$im = @imagecreatefromgif ($imgname); /* Attempt to open */
21:04Michuif (!$im) { /* See if it failed */
21:04Michu$im = imagecreatetruecolor (150, 30); /* Create a blank image */
21:04Michu$bgc = imagecolorallocate ($im, 255, 255, 255);
21:04Michu$tc = imagecolorallocate ($im, 0, 0, 0);
21:04Michuimagefilledrectangle ($im, 0, 0, 150, 30, $bgc);
21:04Michu/* Output an errmsg */
21:04Michuimagestring ($im, 1, 5, 5, "Error loading $imgname", $tc);
21:04Michu}
21:04Michureturn $im;
21:04Michu}
21:04Michuheader("Content-Type: image/gif");
21:04Michu$img = LoadGif("bogus.image");
21:04Michuimagegif($img);
21:04Michu?>
21:04Michutworzy ona obrazek na podstawie innego
21:04Michuktóry ma rozszerzenie gif
21:05Michudo tworzenia linu urzywamy
21:05Michuużywamy
21:05Michuimagedashedline
21:05Michujej skladnia wyglada tak
21:06Michu( $image, $x1, $y1, $x2, $y2, $color)
21:06Michudo tworzenia elips używamy
21:06Michuimagefilledellipse
21:07Michumoże pokoże na przykladzie
21:07Michu<?php
21:07Michu$image = imagecreatetruecolor(400, 300);
21:07Michu$bg = imagecolorallocate($image, 0, 0, 0);
21:07Michu$col_ellipse = imagecolorallocate($image, 255, 255, 255);
21:07Michuimagefilledellipse($image, 200, 150, 300, 200, $col_ellipse);
21:07Michuheader("Content-type: image/png");
21:07Michuimagepng($image);
21:07Michu?>
21:07Michupowyzszy przyklad
21:08Michutworzy elipse
21:08Michuczy coś jest nie zrozumiałe
21:08Michuto prosze pisac
21:08Michubo chce przejsc do 3d
21:09Michuto jezeli nie ma to sadze iz moge przejsc
21:09Michutaką iitacje 3d tez posiada GD
21:09Michutylko dopiero do wersji
21:10Michu2.0.1
21:10Michuto przyklad
21:10Michu<?php
21:10Michu$image = imagecreatetruecolor(100, 100);
21:10Michu$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
21:10Michu$gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
21:10Michu$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
21:10Michu$navy = imagecolorallocate($image, 0x00, 0x00, 0x80);
21:10Michu$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);
21:10Michu$red = imagecolorallocate($image, 0xFF, 0x00, 0x00);
21:10Michu$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);
21:10Michufor ($i = 60; $i > 50; $i--) {
21:10Michuimagefilledarc($image, 50, $i, 100, 50, 0, 45, $darknavy, IMG_ARC_PIE);
21:10Michuimagefilledarc($image, 50, $i, 100, 50, 45, 75 , $darkgray, IMG_ARC_PIE);
21:10Michuimagefilledarc($image, 50, $i, 100, 50, 75, 360 , $darkred, IMG_ARC_PIE);
21:10Michu}
21:10Michuimagefilledarc($image, 50, 50, 100, 50, 0, 45, $navy, IMG_ARC_PIE);
21:10Michuimagefilledarc($image, 50, 50, 100, 50, 45, 75 , $gray, IMG_ARC_PIE);
21:10Michuimagefilledarc($image, 50, 50, 100, 50, 75, 360 , $red, IMG_ARC_PIE);
21:10Michuheader('Content-type: image/png');
21:11Michuimagepng($image);
21:11Michuimagedestroy($image);
21:11Michu?>
21:11Michuna początku jest tworzony obraz i jedo zasoby
21:11Michuczyli jakie proporcje maja miec czesci kola
21:12Michuwszystko dzieki funkcji imagefilledarc
21:12Michuktóra przy dobrym tworzeniu stworzyc imitacje 3d
21:12Michujej parametry to
21:13Michu1 parametr to zmienna $obraz zawierajaca obraz
21:13Michu2 parametr to
21:13Michupołożenie x
21:13Michu3 parametr to położenie y
21:13Michu4 parametr to długość
21:13Michu5 to szerokość
21:14Michu6 za jakim kącie ma zaczać
21:14Michua 7 na jakim skończyć
21:15Michuteraz mam do was pytanie czy chciely byście bym omówił tokeny
21:15Michujak je robic
21:16Michuczyli milczenie juz starozytni wiedzieli ze oznacza to zgode
21:16Michuto tak
21:16Michutoken ma służyć by zapobiec uzywaniu botów na stronie
21:16Michujednak coraz częściej programiści "przesadaja" i token jest trudny do odczytania dla ludzi
21:17Michua jak sie źle wpisze
21:17Michuto człowiek się tylko denerwuje
21:17Michuwięc jak zrobić dobry token
21:17Michu?
21:17Michuzasada jest taka
21:17Michuboty analizuja pixel po pixelu
21:17Michuwiec zmylenie ich różnymi kolorami pomaga
21:18Michuczyli każda litera inny kolor
21:18Michutło roznokolorowe
21:18Michutylko kontrastyjace z literami troche
21:18Michuby sie nie zlewały
21:19Michulosowe pasiki i zakrzywienia przesadza
21:19Michuo wygraniej człowieka z komputeram
21:19Michuczyli jak widać biblioteka GD jest prosta jak budowa czołgu T55
21:19Michutaki zarcik
21:19Michuczy cos przegapiłęm jakies pytania
21:19lidiachyba nie
21:20Michuto dobrze
21:20Michutak gd uzywamy przy prezentacjach i innych rzeczach gdy cos ma byc graficzne
21:20JaBoJaKazda litera - inny kolor = bot moze sobie na podstawie koloru rozdzielic litery do dalszej obrobki
21:20Michudobrym połączeniem było by gd + ajax
21:21Michuale ja mówie o każda litera na 3 kolorowa
21:21Michupixelami tak 1px czarny 2 zielony i tak na zmiana
21:21JaBoJato nic nie da - sprowadzenie obrazu do szarosci jest trywialne
21:21Michuto troche go zdenerwuje
21:21Michuto jak wiadomo bot z js sie gryzie
21:22Michuwystarczy submit daca action=""
21:22Michui niech js prowadzi
21:22Michua nie action w formularzu
21:22JaBoJano i jak ktos wylaczy javascipt to ma problem :P
21:22Michubot nie lubi js
21:23JaBoJaprzed mowieniem niedorzecznosci poczytaj:
21:23JaBoJahttp://pornel.net/captcha
21:23Michuco do tokenów to zawsze losowe paski działały o zakrzywienia
21:23Michuinne źródła czytałem
21:23JaBoJatym co tak naprawde utrudnia sa zakrzywienia
21:24JaBoJai linie o grubości liter
21:24Michuzeby litery miały różna czcionke
21:24Michujednak
21:24JaBoJateż, ale już inne metody są generalnie nieskuteczne
21:24Michuco dzien nowe pomysł co do bota i tokena
21:25Michutak popieram w całej rościagliwaości
21:25JaBoJapozatym zawsze zostaje pytanie czy token jest potrzebny?
21:25Michujednak z tokenami trzeba uwazac najlepiej sprawdzac przegladarke jezeli bot jest słby
21:26Michuto sie nie potszywa
21:26Michui jezeli grozi nam spam to
21:26Michunp
21:26Michu1 kometarz na 30 min z 1 ip
21:26Michuzmiana ip zajmie pare sekund botowi czyli wlaczenie proxy
21:27Michua jezeli
21:27Michuproxy jest nie aktywne czasem przy gorszych botach
21:27Michunastepuje ich zawieszenie
21:28JaBoJaLepiej użyj filtru takiego jak Sblam albo Akismet - nie utrudnisz życia użytkownikom, a spam odfiltruje dość skutecznie.
21:28mTTpotszywa :| ?
21:28Michuno ale z filtrami jak z botami i z tokenami
21:28Michubywa iz wystarczy wpisywac aa
21:28Michupotem aa1
21:28Michuitd.
21:29JaBoJa??
21:29JaBoJanie rozumiem
21:29JaBoJaco masz na myśli?
21:29Michujak jest przeciw spamowi system
21:29Michuto spotkałem sie
21:29Michuiz wystarczyło wpisywać to samo cały czas a do kazdego wyrazu dołaczayć liczbe
21:30Michulub literke inna
21:30JaBoJato widać filtr słaby
21:30Michua takie cos moze sie skonczyc
21:30Michuźle dla serwera
21:30JaBoJaJeśli użyjesz filtru Bayesowskiego dając nieznanym słowom nieznacznie ujemną wagę to myślę że rozwiąże ci to problem.
21:31Michunie ma narazie sprawdzonego systemu którego nie można ominąc zostaje tylko pisać coraz lepsze tokeny i filtry
21:31Michutak rozwiaze czesciowo
21:31Michua jak bot ma słownik i przeglada google by znalesc zdania
21:31Michuto juz kazde jest inne
21:32Michui nie ma nic wspólnego ze wcześniejszym
21:32JaBoJaNo i co mu te zdania dadzą?
21:32Michuda bo filtr nie bedze nic widział w poprawnym zdaniu
21:33Michua przegladarke ip zawsze mozna zmienic
21:33JaBoJaNo ale takie zdanie nic nie zareklamuje.
21:33Michuno nic ale moze posłużyc do ataku
21:33JaBoJaA nie ma sensu tworzyć botów które tylko śmiecą
21:33Michuzapcha pamiec i co wtedy
21:33JaBoJaDo ataku może posłużyć ping :P
21:33Michumoze
21:34Michuale czasem lepiej zatakowac strone zeby ona nie działała
21:34Michua ping tylko spowolni
21:34JaBoJaMożna nawiązać wiele połączeń http z sieci zombie i ich nie kończyć :P.
21:34Michua jak przekroczy lisc mb ustawionych w php to sktypt sie nie wykona
21:34Michuta najpierw trzeba miec siec zombie czyli napisac
21:34Michuprogram który bedze przejmował PC
21:35Michuchba iz jest to siec i bawic sie z rozprzestrzenieniem w lanie fałszywych mac
21:36Michuale nie ma co o atakach DoS pisac bo temat wykladu inny
21:36Michuczy jakies jeszcze pytania
21:36JaBoJaZresztą, strony dla Pentagonu chyba nie robisz, więc aż takie zabezpieczenia nie są potrzebne.
21:36Michuhehe
21:36Michuno nie robie strony la pentadonu
21:36Michuale moze ktos tu obecny nie wiem
21:36Michumoze mu sie to przyda
21:37Michuto jak nie ma pytan to moge zakończyć wyklad
21:37Michuto wyklad zakonczony