Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Graphix
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Szadow
Witajcie forumowicze!

Chciałbym wam przedstawić moją prostą i zarazem nieskomplikowaną klasą Graphix którą napisałem z nudów (jak i w celach edukacyjnych). a postanowiłem wystawić na łamach forum bo uznałem że komuś może się przydać. Ponadto czyni kod (wg. mnie) czytelniejszym i ładniejszym pomijając to że część funkcji to wrappery wink.gif. Oto taki przykładowy kod:

  1. <?php
  2. # Dołączamy plik Graphix
  3. include '../Graphix.class.php';
  4.  
  5. try
  6. {
  7. # Tworzymy nowy obiekt
  8. $graphix = new Graphix();
  9.  
  10. # Wczytujemy obrazek
  11. $graphix->load('water.jpg');
  12. }
  13. # Ten wyjątek występuje kiedy próbujemy wczytać obrazek, który nie istnieje
  14. catch(FileExistsException $e)
  15. {
  16. echo $e->getMessage();
  17. }
  18. # Wyjątek występuje kiedy na serwerze nie jest zainstalowany GD. Jeśli jesteś pewien że masz zainstalowane GD, możesz to wyciąć
  19. catch(ExtenstionNotInstalled $e)
  20. {
  21. echo $e->getMessage();
  22. }
  23.  
  24. # Tworzymy kolory
  25. $graphix->createColor('czerwony', 255, 0, 0);
  26. $graphix->createColor('zielony', 0, 255, 0);
  27. $graphix->createColor('niebieski', 0, 0, 255);
  28. $graphix->createColor('dzikiroz', 255, 0, 255);
  29.  
  30.  
  31. # Tworzymy punkty: pozycja elipsy i jej rozmiar (szerokość i wysokość)
  32. $pos = new Point(150, 80);
  33. $size = new Point(50, 50);
  34.  
  35. # Rysujemy elipsę i koło
  36. $graphix->ellipse($pos, $size, 'czerwony');
  37. $graphix->circle(new Point(220, 180), 50, 'zielony', FILLED);
  38.  
  39. # Piszemy tekst na ekranie
  40. $graphix->write("This text has been made by Graphix\n(for real by GD)!", 13, new Point(10,300), 'magnata', 'arial.ttf');
  41.  
  42. # Używamy filtra pixelate
  43. $fPixelate = new Filter(Filter::Pixelate);
  44. $fPixelate->setArg(PIXELATE_SIZE, 5 );
  45.  
  46. $graphix->filter($fPixelate);
  47.  
  48.  
  49.  
  50. # Wyświetlamy w formacie png
  51. $graphix->render('png');
  52. ?>


Download: Repozytorium na GitHub'ie

Dokumentacja: Dokumentacja

To chyba wszystko. A co do kodu to dla niektórych kod może być gorszy od podstawowego (GD) ale to zależy wyłącznie od własnych upodobań.
Proszę o komentarze i wasze opinie.
darko
Cały projekt został profesjonalnie przygotowany i całość ogólnie wygląda dobrze. Wydajności, ani jakości nie sprawdzałem, ale wierzę, że powinno być ok. Mam kilka luźnych uwag, to co wpadło na szybko:

1) Graphix.class.php:

public function load($path)
{
if(is_readable($path))
{
$ext = explode('.', basename($path));
$ext = $ext[count($ext) - 1];

zawsze się tego czepiam, ale czy nie lepiej użyć przeznaczonej do tego funkcji pathinfo?

$tmp = pathinfo($path);
$ext = strtolower($tmp['ext']);

i to samo metoda save oraz pewnie jeszcze inne metody, w których nie zauważyłem tego kodu. A właśnie tak poza tym to aż się prosi przenieść te dwie linijki, które kilka razy powtarzasz w kilku metodach do osobnej metody np. protected _getExtension($path) ?

2) Czy wiesz, że lepiej używać imagecopyresampled zamiast imagecopyresized? (znacznie lepsza jakość)

3) phpDoc umożliwia też zamieszczanie informacji o autorze (@author) oraz @package @subpackage etc.

4) brakuje mi tu gotowego interfejsu do późniejszej ewentualnej adaptacji dla jakiegoś frameworka.

5) mało efektów udostępniasz, brakuje mi odbicia lustrzanego, falowania, sepii, czerń-biel, odwrócenia barw i innych podstawowych funkcjonalności, ale przede wszystkim brak możliwości nałożenia znaku wodnego sad.gif

Podsumowując:
Kawał dobrej roboty, kod dobrze udokumentowany, ale póki co mało funkcjonalny. Nie ma tutaj niczego, co jest niedostępne u konkurencji - zobacz no, sekcję "Learn how" na stronie http://phpthumb.gxdlabs.com/ Rozważyłbym też możliwość współpracy poprzez api z pakietem ImageMagick.
Szadow
Ad 1. Dzięki, zapomniałem o tej funkcji a kod teraz wygląda ładniej

Ad 2. I tu też miałeś rację po zmianie obraz wygląda znacznie lepiej.

Ad 3. Autorów mam w jednym pliku, bo jak by ktoś ewentualnie dołączył to musiał bym to zmienić w każdym pliku.

Ad 5. Chciałbym zaznaczyć iż jest to wersja beta, obecnie pracuje nad poprawkami ale wkrótce pojawią się niektóre efekty wink.gif

Co do API to rozważę te myśl a póki co dodałem wersję 0.2.1b w której pozmieniałem rzeczy wg. twoich wskazówek i parę innych rzeczy. Oraz dzięki za twój jakże pomocny komentarz.

EDIT: Dodałem link do pobrania dokumentacji.
darko
Nie można na githuba wrzucić dokumentacji? Jeśli zamierzasz rozwijać ten projekt do jakiś poważniejszych rozmiarów rozważ zastosowanie wiki biggrin.gif Powodzenia w dalszych pracach, pewnie kiedyś skorzystam ze stabilnej wersji Twojego softu.
Crozin
Mniej lub bardziej poważne błędy:
1. Wykorzystywanie globalnej przestrzeni nazw.
2. Nieprzestrzeganie konwencji nazewnictwa PSR-0.
3. Śmieci typu require_once - przecież istnieją autoloadery.
4. Przykłady wykorzystania (folder examples) w źródłach projektu?
5. Poleganie na rozszerzeniu w nazwie pliku do detekcji typu pliku.
6. Opieranie się wyłącznie na GD - praktycznie skazanie projektu na śmierć.
7. Wyjątek FileExistsException (czyt: plik istnieje) wyrzucany w momencie gdy plik nie istnieje? Ciekawe.
8. Metody rysujące po obrazie powinny być raczej wyrzucone poza obiekt zamujący się przechowywaniem samego obrazu. Dodawanie własnych rozszerzeń musi być okropne.
9. Kod jest podatny na wiele błędów jak chociażby pobieranie nieistniejącego koloru czy rysowanie po punktach, które nawet nie należą do obrazu.
10. Żaden z Twoich wyjątków nie powinien dziedziczyć bezpośrednio po klasie Exception, bo żaden z nich nie jest aż tak ogólny.
11. Brak absolutnego minimum jeżeli chodzi o dostępne funkcje. Wybacz ale jeżeli nie mogę nawet w jakiś normalny sposób przesunąć punktu o dany wektor, to po cholerę mi takie obiekty, które robią jedynie za kontenery na dane?

Ogólnie to raczej nie warte pokazywania na chwilę obecną. Nic poza źle zaprojektowanym i niewygodnym obiektowym wrapperem na GD.
Szadow
Ad 1. Namespaców na razie nie planuje - mam zamiar to trzymać przez jakiś czas (jeśli nie na zawsze) na 5.2.0
Ad 2. Poprawione (w jakimś stopniu) ale i tak będzie trzeba to poprawić wink.gif
Ad 3. Racja, dodane
Ad 4. To jest GitHub, gdzie ja to mam dać? dry.gif
Ad 5. Do poprawy
Ad 6. Z góry projekt miał być TYLKO i wyłącznie na GD ale zastanawiam się nad jego rozszerzeniem o ImageMagick czy też GMagik.
Ad 7. Wyjątki poprawione (zresztą wcześniej)
Ad 8. Nad tym pracuje
Ad 9. Po co komu rysowanie po nie istniejących punktach? Rysuje tam gdzie chce.
Ad 10. Patrz punkt 7

Wybacz ale po co dawać super napakowany projekt skoro jeśli ktoś inny zobaczy błąd jakiego ja nie wiedziałem być może będzie trzeba wszystko przepisać. A tak to zmieniam w trakcie rozszerzania i wg. mnie publikacja wersji beta nie była za wczesna. Ponad to dodałem parę poprawek (większych czy mniejszych).
Nie ukrywam też że jeszcze dużo zostało do zrobienia...
Crozin
1. Strzał w stopę. Wszystkie nowe projekty opierają się o 5.3. Zresztą jest to na chwilę obecną chyba jedyna rozwijana gałąź.
4. Daj osobno źródła (folder src) i osobno dokumentację z przykładami (folder docs).
9. Po nic. Ale jeżeli się gdzieś walnę i będę próbować robić jakieś dziwne rzeczy to dobrze jest dostać od razu informację o tym, że coś spieprzyłem. To ułatwia pracę.

Ja nie piszę tutaj o jakiś nie wiadomo jak rozbudowanych bibliotekach, a o absolutnym minimum. Na co mi jakieś narzędzie które jedynie mnie ograniczy i utrudni pracę? Tworzenie / przetwarzanie grafiki samo w sobie jest bardzo obszernym zagadnieniem, więc i biblioteki ułatwiające prace z tym muszą być nieco obszerne by zapewnić chociażby minimalne wsparcie.

PS. Betę to się wypuszcza jak projekt ma ręce i nogi, da się go już nawet używać i gdy wprowadzone zmiany będą raczej kosmetyczne.
PS2. "może" i "wg (bez kropki)".
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.