PHP: Náhled fotogalerie
Jednoduchý skript pro vytvoření obrázku obsahujícího náhledy více obrázků.
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.
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$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(); |
Zdrojový kód třídy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
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; } } |