Create watermark image

Discussion in 'PHP' started by goodmast3r, May 20, 2011.

  1. Sefrez

    Sefrez Peon

    Messages:
    26
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #21
    How is this?

    
    class _imagewatermark
    {
    	public function load($img_filename, $wimg_filename, $nimg_filename, $trans_back=false)
    	{
    		if(!file_exists($img_filename))
    			return '001';
    		
    		$ext = array(
    			strtolower(pathinfo($img_filename, PATHINFO_EXTENSION)),
    			strtolower(pathinfo($wimg_filename, PATHINFO_EXTENSION)),
    			strtolower(pathinfo($nimg_filename, PATHINFO_EXTENSION)),
    		);
    		
    		if(!$this->check_ext($ext[0]) || !$this->check_ext($ext[1])
    			|| !$this->check_ext($ext[2]))
    			return '002';
    		
    		$imgs = $this->img_create($img_filename, $this->img_s, $ext[0]);
    		if($imgs == false)
    			return '003';
    		
    		$this->wext = strtolower(pathinfo($wimg_filename, PATHINFO_EXTENSION));
    		$wimgs = $this->img_create($wimg_filename, $this->wimg_s, $ext[1]);
    		if($imgs == false)
    			return '004';
    		
    		if(is_array($trans_back))
    			if($this->set_trans_back($wimgs, $trans_back) == false)
    				return '005';
    		
    		$nimgs = $this->merge_watermark($imgs, $wimgs, $this->wimg_s[0], $this->wimg_s[1]);
    		if($nimgs == false)
    			return '005';
    		
    		if($this->output_img($nimgs, $nimg_filename, $ext[2]) == true)
    			return 'Watermark image created! <a href="'.$nimg_filename.'">Link</a>';
    		else
    			return '006';
    	}
    	
    	private function output_img($resource, $filename, $ext)
    	{
    		ob_start();
    		call_user_func('image'.$this->extensions[$ext], $resource);
    		$img_data = ob_get_contents();
    		ob_end_clean();
    		
    		if(($fh = @fopen($filename, 'w')) == false)
    			return false;
    		if(fwrite($fh, $img_data) == false)
    			return false;
    		
    		return true;
    	}
    	
    	private function merge_watermark($imgs, $wimgs, $sw, $sh)
    	{
    		$dx = $this->img_s[0] - $this->wimg_s[0];
    		$dy = $this->img_s[1] - $this->wimg_s[1];
    		
    		if(imagecopymerge($imgs, $wimgs, $dx, $dy, 0, 0, $sw, $sh, 100) == false)
    			return false;
    		
    		return $imgs;
    	}
    	
    	private function img_create($filename, &$_img_s, $ext)
    	{
    		if(($_img_s = $this->image_s($filename)) == false)
    			return false;
    		
    		return call_user_func('imagecreatefrom'.$this->extensions[$ext], $filename);
    	}
    	
    	private function set_trans_back(&$img_resource, $tr_bk)
    	{
    		$col = imagecolorallocate($img_resource, $tr_bk[0], $tr_bk[1], $tr_bk[2]);
    		imagecolortransparent($img_resource, $col);
    		
    		return true;
    	}
    	
    	private function image_s($filename)
    	{
    		$spec = getimagesize($filename);
    		if($spec[0] == 0 || $spec[1] == 0)
    			return false;
    		
    		return array($spec[0], $spec[1]);
    	}
    	
    	private function check_ext($ext)
    	{
    		if(!in_array($ext, array_flip($this->extensions)))
    			return false;
    		
    		return true;
    	}
    	
    	private $extensions = array(
    		'jpeg' => 'jpeg',
    		'jpg' => 'jpeg',
    		'png' => 'png',
    		'gif' => 'gif'
    	);
    	
    	private $trans, $img_s, $wimg_s;
    }
    
    $_imagewm = new _imagewatermark;
    echo $_imagewm->load(
    	'i.png' /* image */,
    	'w.png' /* watermark */,
    	'new.png' /* new image w/ watermark */,
    	array(255, 255, 255) /* RGB background color of watermark image to make transparent, leave false for no transparency of specific color code */
    );
    
    PHP:
    It is not bullet proof as I tried to code it quickly, but it worked.

    Edit:
    Fixed known bug.
     
    Last edited: May 21, 2011
    Sefrez, May 21, 2011 IP
  2. rainborick

    rainborick Well-Known Member

    Messages:
    424
    Likes Received:
    33
    Best Answers:
    0
    Trophy Points:
    120
    #22
    The script itself doesn't modify the original image file because it's unnecessary. The instructions for your .htaccess file will tell the server to use the script to serve the image file, so no user could copy the file without getting the watermarked version. That's the "automatic" part.
     
    rainborick, May 22, 2011 IP