Ниже приведена функция водяного знака, которую я сделал для сценария загрузки php-фотографий. Мне любопытно, есть ли лучший способ сделать части, проверяющие тип файла, заметить, что мне пришлось использовать эту часть кода 2 раза
<?PHP function watermark($source_file,$source_width,$source_height,$image_type) { //first image below will be large then small in 1line if/else $watermarksize = ($source_width > 300) ? '../images/fpwatermark.gif' : '../images/fpwatermark.gif'; //now add the watermark to the image. $watermark = imagecreatefromgif($watermarksize); switch ($image_type) { case 'gif': $image = imagecreatefromgif($source_file); break; case 'jpg': $image = imagecreatefromjpeg($source_file); break; case 'png': $image = imagecreatefrompng($source_file); break; default: $image = imagecreatefromjpeg($source_file); break; } //get the dimensions of the watermark list($water_width, $water_height) = getimagesize($watermarksize); // Water mark process $x = $source_width - $water_width - 8; //horizontal position $y = $source_height - $water_height - 8; //vertical positon // imagesy($image) can be the source images width imagecopymerge($image, $watermark, $x, $y, 0, 0, $water_width, $water_height, 65); switch ($image_type) { case 'gif': imagegif($image, $source_file, 90); break; case 'jpg': imagejpeg($image, $source_file, 90); break; case 'png': imagepng($image, $source_file, 90); break; default: imagejpeg($image, $source_file, 90); break; } imagedestroy($image); return $source_file; } ?>
Вы можете использовать динамические вызовы функций, как показано ниже. Этот код тонко отличается от вашего, поскольку он возвращает, если указан недопустимый тип изображения, а не предполагается, что он jpeg. Если вы настаиваете на этом поведении, его должно быть достаточно легко изменить, жестко.
Это не всегда так, что все эти типы изображений поддерживаются PHP, поэтому вы можете использовать функцию function_exists (), чтобы проверить это до их вызова. Вызов несуществующей функции является фатальной ошибкой в PHP.
<?PHP function watermark($source_file,$source_width,$source_height,$image_type) { $validTypes = array("gif" => "gif", "jpg" => "jpeg", "jpeg" => "jpeg", "png" => "png"); if (!array_key_exists($image_type, $validTypes)) { trigger_error("Not a valid image type", E_USER_WARNING); return NULL; } $inFunc = "imagecreatefrom" . $validTypes[$image_type]; $outFunc = "image" . $validTypes[$image_type]; //first image below will be large then small in 1line if/else $watermarksize = ($source_width > 300) ? '../images/fpwatermark.gif' : '../images/fpwatermark.gif'; //now add the watermark to the image. $watermark = imagecreatefromgif($watermarksize); // open the image using the assigned function $image = $inFunc($source_file); //get the dimensions of the watermark list($water_width, $water_height) = getimagesize($watermarksize); // Water mark process $x = $source_width - $water_width - 8; //horizontal position $y = $source_height - $water_height - 8; //vertical positon // imagesy($image) can be the source images width imagecopymerge($image, $watermark, $x, $y, 0, 0, $water_width, $water_height, 65); // save the image $outFunc($image, $source_file, 90); imagedestroy($image); return $source_file; }
Если у вас установлено расширение exif, вы можете использовать exif_imagetype () для автоматического определения типа изображения.
Другой вариант, который немного более изящный, но также содержит больше кода, заключается в использовании полиморфизма:
<?php interface Codec { public function open($file); public function save($img); } class JPEGCodec implements Codec { public function open($file) { return imagecreatefromjpeg($file); } public function save($img, $out_file) { imagejpeg($img, $out_file, 90); } } class PNGCodec implements Codec { public function open($file) { return imagecreatefrompng($file); } public function save($img, $out_file) { imagepng($img, $out_file, 9); } } class GIFCodec implements Codec { public function open($file) { return imagecreatefromgif($file); } public function save($img, $out_file) { imagegif($img, $out_file); } } class WatermarkException extends Exception {} class Watermark { private $_codecs = array(); public function __construct() { $this->_codecs["jpg"] = $this->_codecs["jpeg"] = new JPEGCodec(); $this->_codecs["png"] = new PNGCodec(); $this->_codecs["gif"] = new GIFCodec(); } function watermark($source_file,$source_width,$source_height,$image_type) { if (!array_key_exists($image_type, $this->_codecs)) { throw new WatermarkException("Not a valid image type"); } $codec = $this->_codecs[$image_type]; //first image below will be large then small in 1line if/else $watermarksize = ($source_width > 300) ? '../images/fpwatermark.gif' : '../images/fpwatermark.gif'; //now add the watermark to the image. $watermark = imagecreatefromgif($watermarksize); // load image $image = $codec->open($source_file); //get the dimensions of the watermark list($water_width, $water_height) = getimagesize($watermarksize); // Water mark process $x = $source_width - $water_width - 8; //horizontal position $y = $source_height - $water_height - 8; //vertical positon // imagesy($image) can be the source images width imagecopymerge($image, $watermark, $x, $y, 0, 0, $water_width, $water_height, 65); // save image $codec->save($image, $source_file); imagedestroy($image); return $source_file; } }
Я понимаю, что вы, вероятно, предпочтете первую. 🙂