www.www.zaachi.com » Blog/Php » 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:
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ý:
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();
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;
}
}
