Aşağıda gösterildiği gibi, dinamik fonksiyon çağrılarını kullanabilirsiniz. Geçersiz bir resim türü, jpeg olduğunu varsaymak yerine sağlandığı takdirde döndürür beri bu kod sizinkinden biraz farklı olduğunu. Bu davranışı ısrar ederse zor, değiştirmek için yeterince kolay olmalı.
Her zaman onları çağırmadan önce bu kontrol etmek için function_exists() kullanmak isteyebilirsiniz böylece tüm bu görüntü türleri PHP tarafından desteklenen bir durum değildir. Bir var olmayan işlevini çağırarak PHP ölümcül bir hatadır.
<?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;
}
Eğer exif uzantısı yüklü varsa, exif_imagetype() otomatik olarak görüntünün türünü tespit etmek için kullanabilirsiniz.
Biraz daha şık, ama aynı zamanda daha fazla kod içeren bir başka seçenek polymorfism kullanmaktır:
<?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;
}
}
Ben muhtemelen ilkini tercih edeceksiniz biliyoruz. :)