您可以使用动态函数调用,如下图所示。此代码与您的代码略有不同,因为如果提供了无效的图像类型,它会返回而不是假定它是 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;
}
}
我知道你可能更喜欢第一个。:)