www.www.zaachi.com »  Blog/Php  »  PHP: Náhled fotogalerie

PHP: Náhled fotogalerie



Jednoduchý skript pro vytvoření obrázku obsahujícího náhledy více obrázků.

 

Reklama

Pokud mě chcete podpořit a jste milovník jedné stopy, navštivte můj projekt: MotoArena.cz

Velice jednoduchý skript pro vytvoření náhledů například fotogalerie, který pomocí GD knihovny poskládá náhledy z několika obrázku do jednoho velkého obrázku.

image prew

Skript umožňuje zadat libovolný počet obrázku, včetně popisů, které postupně kopíruje a vytváří náhledy o určité velikosti.

Konstruktor třídy má tři nepovinné parametry:

  • výška v pixelech
  • šířka v pixelech
  • barva pozadí

Po vytvoření nové instance je pro naplnění obrázky volána metoda "add", která může mít celkem tři parametry. První dva jsou povinné, třetí je nepovinný:

  • cesta a název k fotografii
  • titulek u fotografie
  • barva rámečku fotografie

Veškeré barvy jsou zadávány ve formátu kódu barvy: #ffffff. Skript si je převede automaticky na RGB a alokuje.

Pro vykreslení obrázku je volána metoda paint();

Velikost miniatur je dána staticky, hodnou proměnné max_size, která je public, čili ji lze měnit. Tato hodnota je v pixelech a udává největší rozměr obrázku, ať už je to výška nebo šířka.

Ve skriptu existuje ještě jedna public proměnná, ke které je přístup. Je to proměnná color a určuje barvu titulku u fotografíí. Defaultně je nastavena na černou barvu.

Při použití velkého množství obrázků nebo obrázků ve velkém rozlišení může být vytvoření náhledů velmi pomalé.

Při generování jsou náhledy v obrázku rozmístěny náhodně, čili při každém novém generování jinak. Pořadí obrázků zůstává stále stejné, a to takové, v jakém byly přidány.

Ukázka vygenerování obrázku:

$image = new image_album_create(550, 300);
$image->color = '#191970';
$image->max_size = 200;
$image->add('HPIM1881.JPG', 'HPIM1881.JPG');
$image->add('HPIM1882.JPG', 'HPIM1882.JPG');
$image->add('HPIM1883.JPG', 'HPIM1883.JPG');
$image->add('HPIM1884.JPG', 'HPIM1884.JPG');
$image->add('HPIM1885.JPG', 'HPIM1885.JPG');
$image->add('HPIM1886.JPG', 'HPIM1886.JPG');
$image->add('HPIM1887.JPG', 'HPIM1887.JPG');
$image->add('HPIM1888.JPG', 'HPIM1888.JPG');
$image->add('HPIM1889.JPG', 'HPIM1889.JPG');
$image->add('HPIM1890.JPG', 'HPIM1890.JPG', '#808000');
$image->add('HPIM1891.JPG', 'HPIM1891.JPG', '#708090');
$image->paint();
image prew2

Zdrojový kód třídy:

class image_album_create{
    
    //private promenne
    private $width; 
    private $height;
    private $photos = array();
    private $titles = array();
    private $background_colors = array();
    private $image;
    private $background = null;
    
    //public promenne
    public $color = '#000000';
    public $max_size = 200;
    
    /**
    *   Konstruktor 
    *   Konstruktor tridy. Umoznuje nastavit velikost celkového obrazku a barvu pozadi. 
    */
    function __construct( $width = 400, $height = 400, $background = '#ffffff' ){
        $this->width = $width;
        $this->height = $height;
        $this->background = $background;
    }   
    
    /**
    *   Metoda pro pridani fotografie. 
    *   Vstupni parametry jsou: cesta k fotografii, titulek, barva pozadi
    */
    function add( $photo, $title, $bgcolor = '#dcdcdc' ){
        $this->photos[] = $photo;
        $this->titles[] = $title;
        $this->background_colors[] = $bgcolor;
    }
    
    public function decodeColor( $htmlColor )
    {
    	if($htmlColor[0] != '#'){
    		return FALSE;                                                     
    	}
    	$red    = hexdec(@substr($htmlColor, 1, 2));
    	$green  = hexdec(@substr($htmlColor, 3, 2));
    	$blue   = hexdec(@substr($htmlColor, 5, 2));
    	return $vcolor = array($red, $green, $blue);
    }
    
    function _create_image(){
        $this->image = imagecreatetruecolor($this->width, $this->height);
        $color = imagecolorallocate( $this->image, 255, 255, 255 );
        $colors = self::decodeColor( $this->background );
        
        $this->bcg = imagecolorallocate($this->image, $colors[0], $colors[1], $colors[1]);
        ImageFilledRectangle( $this->image, 0, 0, $this->width, $this->height, $this->bcg );          
    }                                               
    
    function paint(){
        self::_create_image();
        $center_x = $this->width / 2;
        $center_y = $this->height / 2;
        for( $i = 0; $i < count( $this->photos ); $i++ ){
            $im = self::_add_image( $this->photos[$i], $this->titles[$i], $this->background_colors[$i] );
            if( $im != null ){
                $move_x = $center_x;
                $move_y = $center_y;
                imagecopy( $this->image, $im, $center_x + rand( 0-$center_x, $center_x - imagesx($im)), $center_y + rand(0-$center_y, $center_y - imagesy( $im )), 0, 0, imagesx( $im ), imagesy( $im ) );
            }
        }
        
        Header("Content-Type: image/png");
        header('Pragma: public');
        header('Cache-Control: no-store, no-cache, must-revalidate'); 
        header('Cache-Control: pre-check=0, post-check=0, max-age=0');   
        header ("Pragma: no-cache");
    
        imagepng( $this->image);
    }
    
    function _add_image( & $img, & $title, $color ){
        if( !file_exists( $img ) ){
            return;
        }   
        
        $size = getimagesize( $img );
        $old_width = $size[0];
        $old_height = $size[1];
        switch ($size[2]) {
            case 1: $temp_img = imagecreatefromgif( $img ); break;
            case 2: $temp_img = imagecreatefromjpeg( $img ); break;
            case 3: $temp_img = imagecreatefrompng( $img ); break;
            default: return ;
        }

        $size = self::_get_new_size( $size[0], $size[1]);
        $new_img = imagecreatetruecolor( $size['width'] + 10, $size['height'] + 30);  
        
        $color = self::decodeColor( $color );
        $color = imagecolorallocate( $new_img, $color[0], $color[1], $color[2]);
        ImageFilledRectangle( $new_img, 0, 0, $size['width'] + 10, $size['height'] + 30, $color );
        
        imagecopyresampled( $new_img, $temp_img, 5, 5, 0, 0, $size['width'], $size['height'], $old_width, $old_height);
        
        $black = self::decodeColor($this->color);
        $black = imagecolorallocate( $new_img, $black[0], $black[1], $black[1] );
        
        self::_add_title( $new_img, $title, $size['width'] + 10, $size['height'], $black );
        
        imagerectangle( $new_img, 0, 0, $size[ 'width' ] + 9 , $size['height'] + 29, $black);
        //$new_img = imagerotate($new_img, 1, $this->bcg);
        return $new_img;        
    }
    
    function _add_title( & $img, $title, $width, $height, $black ){
        if( trim ( $title ) === null )
            return;
        $font_width = imagefontwidth( 3 );
        
        if( ($width-10)/$font_width <= strlen( $title ) )
            imagestring($img, 3, 5, $height + 10, substr( $title, 0, ceil($width-10)/$font_width ), $black );
        
        $start = $width / 2 - ( strlen( $title ) * $font_width)/2;
        imagestring($img, 3, $start, $height + 10, $title,  $black );
    }
    
    function _get_new_size( $width, $height ){
        if( $width > $height ){
            $new_size['width'] = $this->max_size;
            $p = $width / $new_size['width'];     
            $new_size['height'] = round( $height / $p );
        }elseif( $height > $width ){
            $new_size['height'] = $this->max_size;
            $p = $height / $new_size['height'];                
            $new_size['width'] = round( $width / $p );
        }elseif( $height == $width ){
               $new_size = array('width' => $this->max_size, 'height' => $this->max_size );
        }
        return $new_size;
    }
}

 

 


linkuj topclanky
Komentáře (0)

Autor: Zaachi
Publikováno: 9.5.2008 18:50:23
TOPLIST.cz

rss coments img img img