Source for file Graph.class.php

Documentation is available at Graph.class.php

  1. <?php
  2. /**
  3.  * R.E. PHP Graph v1.0
  4.  * 
  5.  * Ez a program megkönnyíti a bonyolultabb alakzatok és megoldások generálását PHP-ben képekre.<br />
  6.  * Alapvetően 3 féle típus támogatott. GIF, JPEG és PNG<br />
  7.  * A generált képek megjeleníthetők a böngészőben, vagy lementhetők a webszerverre, illetve a kliens gépre is.
  8.  * 
  9.  * @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
  10.  * @copyright Copyright (C) 2008, Takács Ákos
  11.  * @version 1.0
  12.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  13.  * 
  14.  * @example examples/fullExample.php Teljes példa
  15.  * @package REPHPGraph
  16.  */
  17.         
  18. /**
  19.  * Szükséges függvények
  20.  */
  21. require_once dirname(__FILE__)."/functions.php";
  22.  
  23. /**
  24.  * Agraph importálása
  25.  */
  26. require_once dirname(__FILE__)."/AGraph.class.php";
  27.  
  28. /**
  29.  * FileExistsException ipmortálása
  30.  */
  31. require_once dirname(__FILE__)."/exceptions/FileExistsException.class.php";
  32.  
  33. /**
  34.  * DirExistsException ipmortálása
  35.  */
  36. require_once dirname(__FILE__)."/exceptions/DirExistsException.class.php";
  37.  
  38. /**
  39.  * Grafikát vezérlő osztály
  40.  * 
  41.  * Ebből az osztályból példányosított objektum segítségével hozható létre fő kép,<br />
  42.  * amire ráhelyezhetők a további alakzatok, minták, képek.<br />
  43.  * Lehetőséget nyújt az eredmény szerverre, valamint kliens gépre mentésére, illetve a böngészőben megjelenítésre.<br />
  44.  * Tartalmaz továbbá egy, a színek létrehozására szolgáló {@link createColor()} metódust is.
  45.  * <br />
  46.  * Üres fekete kép létrehozása ( 200 x 200 )
  47.  * <code>
  48.  * <?php
  49.  * $graph = new Graph(200,200);
  50.  * $graph->setBackground(0,0,0);
  51.  * $graph->flush();
  52.  * ?>
  53.  * </code>
  54.  * 
  55.  * @version 1.1
  56.  * @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
  57.  * @copyright Copyright (C) 2008, Takács Ákos
  58.  * @package REPHPGraph
  59.  */
  60. class Graph extends AGraph 
  61. { 
  62.     /**
  63.      * Képre felvitt alakzatok erőforrás azonosítóinak listája
  64.      * 
  65.      * @var array 
  66.      */
  67.     protected $objects = array();
  68.  
  69.     /**
  70.      * Grafikus elemek importja
  71.      *
  72.      * @param mixed $objects Importálandó grafikus elem osztályok neve
  73.      *                          (Ha egy osztály, lehet string. Több esetén tömb
  74.      *                          illetve paraméter nélkül hívva az összes grafikus elem)
  75.      */
  76.     public static function importObject($objects=null) {
  77.         self::import('objects',$objects);
  78.     }
  79.  
  80.     /**
  81.      * Iterátorok importja
  82.      *
  83.      * @param mixed $iterators Importálandó iterátor osztályok neve
  84.      *                          (Ha egy osztály, lehet string. Több esetén tömb
  85.      *                          illetve paraméter nélkül hívva az összes grafikus elem)
  86.      */
  87.     public static function importIterator($iterators=null) {
  88.         self::import('iterators',$iterators);
  89.     }
  90.     /**
  91.      * Osztályok importja
  92.      *
  93.      * @param string $dir Mappa neve, ahol az importálandó osztályok vannak
  94.      * @param mixed $objects Importálandó osztályok neve
  95.      *                          (Ha egy osztály, lehet string. Több esetén tömb
  96.      *                          illetve paraméter nélkül hívva az összes grafikus elem)
  97.      */
  98.     public static function import($dir,$classes=null) {
  99.         $dir = dirname(__FILE__).'/'.trim($dir,'/');
  100.         if (!is_dir($dir)) {
  101.             throw new DirExistsException("Nincs ilyen könyvtár: ".$dir);
  102.         }
  103.         $all = false;
  104.         if (is_string($classes)) {
  105.             $classes = array($classes); 
  106.         } else if (!$classes) {
  107.             $classes = scandir($dir);
  108.             $all=true;
  109.         }
  110.         foreach ($classes as $object) {
  111.             if ($object != '.' and $object != '..' and !is_dir($dir.'/'.$object)) {
  112.                 if (!$all) { $object .= '.class.php'; }
  113.                 else if ( end(explode('.',$object)) != 'php' ) {
  114.                     continue;
  115.                 }
  116.                 if (!file_exists($dir.'/'.$object)) {
  117.                     throw new FileExistsException("Nincs ilyen grafikus elem: $dir/".$object);
  118.                 }
  119.                 require_once $dir.'/'.$object;
  120.             }
  121.         }
  122.     }
  123.     
  124.     /**
  125.      * Kép háttérszínének lekérdezése
  126.      * @return int 
  127.      */
  128.     public function getBackground()
  129.     {
  130.         return $this->background;
  131.     }
  132.     /**
  133.      * Kép háttérszínének beállítása
  134.      * 
  135.      * Paraméterezése és működése megegyezik a {@link createColor()}
  136.      * metódus paraméterezésével működésével.
  137.      * 
  138.      * @param int $color 
  139.      * @param int $greenc 
  140.      * @param int $bluec 
  141.      */
  142.     public function setBackground($color,$greenc=null,$bluec=null) 
  143.     {
  144.         $this->backGround = $this->createColor($color,$greenc,$bluec);    
  145.     }
  146.             
  147.     /**
  148.      * Létrehoz egy üres képet $width szélességgel és $height magassággal
  149.      * 
  150.      * @param int $width Kép szélessége
  151.      * @param int $height Kép magassága
  152.      */
  153.     public function __construct($width,$height)
  154.     {
  155.         $this->width = $width;
  156.         $this->height = $height;
  157.         $this->source = imagecreatetruecolor($width,$height);
  158.     }
  159.     
  160.     /**
  161.      * Objektumok hozzáadása a képhez
  162.      * 
  163.      * Minden újabb képet, vagy alakzatot át kell adni a Graph osztályból példányosított objektumnak.<br />
  164.      * Ez a metódus meghívja az objektum {@link IObject::create()} metódusát, majd létrehozza
  165.      * a megfelelő típusú képet. Ennek a képnek az erőforrásazonosítóját hozzáadja a az {@link $objects} listához.
  166.      * 
  167.      * @param AObject $object 
  168.      */
  169.     function add($object)
  170.     {
  171.         ob_start();
  172.         //háttér kirajzolása
  173.         imagefilledrectangle($object->source,0,0,$object->width-1, $object->height-1, $object->backGround);
  174.         //ha a transparent tulajdonság true, akkor háttérszín beállítása áttetszővé
  175.         if ($object->transparent === true) {
  176.             imageColorTransparent($object->source,$object->backGround);
  177.         }
  178.         //alakzat irajzolása
  179.         $object->create();
  180.         //típus meghatározás
  181.         if (!array_search($object->type,$object->types,true) or $object->type == "jpg") {
  182.             $object->type = 'jpeg';
  183.         }
  184.                 
  185.         //kép létrehozása
  186.         if ($object->transparent === true) {
  187.             imagegif($object->source); 
  188.         } else {
  189.             $this->createImage($object,'image'.$object->type); 
  190.         }
  191.         //kimenet elfogásával az erőforrásazonosító betöltése az $objects listába
  192.         $image = ob_get_clean();
  193.         $object->source = imageCreateFromString($image); 
  194.         $this->objects[] = $object;    
  195.     }
  196.     
  197.     /**
  198.      * Felépíti az $objects listából a képet
  199.      * 
  200.      * @return string imageGif | imageJpeg | imagePng
  201.      */    
  202.     private function buildImage() 
  203.     {
  204.         //háttérszínnel kitölti a fő képet
  205.         imagefilledrectangle($this->source, 0,0, $this->width-1, $this->height-1, $this->backGround);
  206.         //szükség esetén áttetszővé teszi a hátteret
  207.         if ($this->transparent === true ) {
  208.             imageColorTransparent($this->source, $this->backGround);
  209.         }
  210.         //az $objects tömb összes elemét rámásolja a fő képre
  211.         foreach($this->objects as $key => $object) {
  212.             imagecopy($this->source,$object->source,$object->x - ($object->width / 2),$object->y - ($object->height / 2),0,0,$object->width,$object->height);    
  213.         }
  214.         //típus beállítása
  215.         if (!array_search($this->type,$this->types,true) or $this->type == "jpg") {
  216.             $this->type = 'jpeg';
  217.         }
  218.         return 'image'.$this->type;       
  219.     }        
  220.         
  221.     /**
  222.      * Kép létrehozása
  223.      * 
  224.      * Létrehoz egy képet az $object objektumból a $func függvény segítségével.<br />
  225.      * Szükség esetén az $src néven lementi a képet a szerveren
  226.      * 
  227.      * @param Object $object AObject | Graph
  228.      * @param string $func képet létrehozo függvény neve
  229.      * @param string $src kép helye mentés esetén
  230.      */
  231.     private function createImage($object,$func,$src=null) 
  232.     {
  233.         //ha nem gif és nem png képről van szó, akkor a minőséget is be lehet állítani
  234.         if(strtolower($object->type) != 'gif' and strtolower($object->type) != 'png')
  235.         {
  236.             $func($object->source,$src,$object->quality);
  237.         }else{
  238.             $func($object->source,$src);
  239.         }                
  240.     }  
  241.     /**
  242.      * Kép küldése a kimenetre.
  243.      */
  244.     function flush()
  245.     {
  246.         //kép összeállítása
  247.         $func = $this->buildImage();
  248.         //kimenet típusának beállítása
  249.         header("Content-type: image/".$this->type);
  250.         //kimenetre küldés    
  251.         $this->createImage($this,$func);
  252.     }
  253.  
  254.     /**
  255.      * Kép felkínálása letöltésre a kliensen
  256.      * 
  257.      * @param string $src Letöltés után milyen néven legyen mentve a kép
  258.      */
  259.     function saveClient($src)
  260.     {
  261.         //kép összeállítása
  262.         $func = $this->buildImage();
  263.         //kimenet tipusának beállítása, és letöltésre állítás
  264.         header("Content-type: image/".$this->type);
  265.         header('Content-Disposition: attachment; filename="'.trim(htmlentities(basename($src))).'"'); 
  266.         //küldés a kimenetre
  267.         $this->createImage($this,$func);
  268.     }    
  269.     /**
  270.      * Kép mentése a szerveren
  271.      * 
  272.      * @param string $src Mentés helye
  273.      */
  274.     function save($src)
  275.     {
  276.         $this->createImage($this,$this->buildImage(),$src);
  277.     }        
  278. }
  279.  
  280. ?>

Documentation generated on Tue, 09 Feb 2010 01:17:48 +0100 by phpDocumentor 1.4.1