I needed a simple watermarking hack to accomplish the following:
- Compatible with GD 2.0
- On the fly watermarking
- Non server intensive
- Customize expansion
- Identify individual images to watermark
- PNG input/output support
I wanted to be able to specify which images to watermark indivually within an album. I needed to also make sure that the watermark didn't swamp the main image. I also wanted a quick way to adjust the positioning of the watermark on the image.
The way this mod works is evaluates the user1 field to determine if image is to be watermarked. If 'yes' then it sends the image uri to the watermark class to be evaluated if the images is to small for watermark, if not it watermarks the file and save a copy to a determined folder. When the image is called a second time instead of creating a new file it pulls the created watermarked image and sends this back to the image display as a src. Any serious errors will stop the script and give descriptive results of the problem.
Planned future updates:
- Modify config to turn watermark on/off.
- Allow for evaluation of watermarked file date to allow for watermark updates
- Customizable setup from browser/integrate with dbase
1) First create a PNG watermark and upload it into the main images folder.
2) Ok, onto the code. *don't forget to backup all files being modified.
Open functions.inc.php and find:
return $url_prefix[$pic_row['url_prefix']]. path2url($pic_row['filepath']. $pic_prefix[$mode]. $pic_row['filename']);
comment the code out (incase you decide to go back or the mod breaks while installing).
Add as a new line below commented code:
if ($pic_row['user1']!="YES") {
return $url_prefix[$pic_row['url_prefix']]. path2url($pic_row['filepath']. $pic_prefix[$mode]. $pic_row['filename']);
} else {
require_once "include/watermark.class.php";
$watermark_file_location = 'images/watermark.png';
$picture_location = $url_prefix[$pic_row['url_prefix']]. path2url($pic_row['filepath']. $pic_prefix[$mode]. $pic_row['filename']);;
$img = new Watermark();
$img->watermark_file = $watermark_file_location;
$img->add_watermark($picture_location);
return $img->image_tag;
}
3) Create a file called
watermark.class.php save this into the
include folder, insert the following code and save:
<?php
/**
* Custom Watermark Class for PNG or JPG watermarks with GD2
* Modified for use with Coppermine Image Gallery http://coppermine.sourceforge.net
*
* Usage Example:
Find in functions.inc.php:
return $url_prefix[$pic_row['url_prefix']]. path2url($pic_row['filepath']. $pic_prefix[$mode]. $pic_row['filename']);
Replace with:
if ($pic_row['user1']!="YES") {
return $url_prefix[$pic_row['url_prefix']]. path2url($pic_row['filepath']. $pic_prefix[$mode]. $pic_row['filename']);
} else {
require_once "include/watermark.class.php";
$watermark_file_location = 'images/watermark.png';
$picture_location = $url_prefix[$pic_row['url_prefix']]. path2url($pic_row['filepath']. $pic_prefix[$mode]. $pic_row['filename']);;
$img = new Watermark();
$img->watermark_file = $watermark_file_location;
$img->add_watermark($picture_location);
return $img->image_tag;
}
*
*
* @hacked Timothy Wood <info@skybax.com>
* @Idea from SmartThumb http://www.fullo.net/progetti/smartthumb/
* @authors to Philipp v. Criegern <criegep@criegern.com> & Francesco Fullone <ffullone@progettoaroma.com>
*
* @version 1.0 8/8/2004 (hacked)
*/
class Watermark
{
/**
* Directory where the created watermarked images are stored in (for PHP access)
* e.g. '/usr/local/apache/htdocs/images/watermark'
*/
var $thumbnail_dir_internal = '/home/erotic/public_html/wmarked/';
/**
* Path to watermarked directory for browser/coppermine access
* e.g. '/images/thumbnails'
*/
var $thumbnail_dir_external = '../wmarked/';
/**
* Watermarked image suffix for new watermarked image
* e.g. 'watermarksuffix_orginal.jpg'
* WARNING: Cannot be left blank
*/
var $file_suffix = 'watermark_';
/**
* Error message if creation fails, this will crash the gallery for the particular image if all fails...
*/
var $error;
/**
* where the watermark is inserted
* topleft, bottomleft, topright, bottomright
*/
var $watermark_position = "bottomright";
/**
* the watermark filename
* currently MUST be a PNG24 file! working on gif/jpg support
*/
var $watermark_file;
/**
* which kind of output is request
* valid value is JPG, PNG*
* * if using PNG - look @ www.skybax.com for more information on how to secure images
* (neat transparency effect that disables 'easy' harvesting of images)
*/
var $extension = 'JPG';
/**
* this method REQUIRES the GD 2.0+
* @param string $imagefile Filename of source image
*/
function add_watermark ( $imagefile )
{
if ((is_file($this->watermark_file)) && (function_exists('imagecreatetruecolor')))
{
$this->image_name = $this->file_suffix.basename($imagefile);
$this->image_tag = $imagefile;
if (!is_file($this->thumbnail_dir_internal . $this->image_name))
{
$old = $this->image_info($imagefile);
$logo = ImageCreateFromPNG($this->watermark_file) or die($this->watermark_file.' is not a valid PNG24 file!');
$logo_w = imagesX($logo);
$logo_h = imagesY($logo);
// Check that image to be modified will not be swamped by watermark. (image has to be twice the size of the watermark)f
$original = $this->image_info($imagefile);
$original_w = imagesX($old);
$original_h = imagesY($old);
if ($original_w > ($logo_w * 2) && $original_h > ($logo_h * 2)){
if (strtoupper($this->watermark_position) == "TOPLEFT")
{
$src_x = 0;
$src_y = 0;
}
elseif (strtoupper($this->watermark_position) == "TOPRIGHT")
{
$src_x = $this->width - $logo_w;
$src_y = 0;
}
elseif (strtoupper($this->watermark_position) == "BOTTOMLEFT")
{
$src_x = 0;
$src_y = $this->height - $logo_h;
}
elseif (strtoupper($this->watermark_position) == "BOTTOMRIGHT")
{
$src_x = $this->width - $logo_w;
$src_y = $this->height - $logo_h;
}
else
{
die ('the watermark position: ' . $this->watermark_position . ' is non recognized! try with: TOPLEFT, BOTTOMLEFT, TOPRIGHT, BOTTOMRIGHT');
}
$new = imagecreatetruecolor($this->width, $this->height);
ImageAlphaBlending($new, true) or die ("Could not alpha blend");
ImageCopy($new, $old, 0, 0, 0, 0, $this->width, $this->height);
ImageCopy($new, $logo, $src_x, $src_y, 0, 0, $logo_w, $logo_h);
$this->save_image($new);
ImageDestroy($new);
ImageDestroy($old);
ImageDestroy($logo);
}else{ return $img->image_tag; }
// $img->image_tag;
}
else
{
$arr = getimagesize($this->thumbnail_dir_internal . $this->image_name);
$this->width = $arr[0];
$this->height = $arr[1];
}
//place $this->image_tag in the SRC of <img>
$this->image_tag = $this->thumbnail_dir_external . $this->image_name ;
}
else { die('Watermarking file: '. $this->watermark_file.' did not work!'); }
}
/**
* check the directory and update the class var
*/
function check_conf()
{
if (strlen($this->thumbnail_dir_internal) && (substr($this->thumbnail_dir_internal, -1) != '/'))
{
$this->thumbnail_dir_internal .= '/';
}
if (strlen($this->thumbnail_dir_external) && (substr($this->thumbnail_dir_external, -1) != '/'))
{
$this->thumbnail_dir_external .= '/';
}
}
/**
* check the imagefile info to create the correct image stream
* @param $imagefile the image filename
* @return $img the image stream
*/
function image_info($imagefile)
{
$tmp_extension = strtoupper(substr(basename($imagefile), -3));
if ( $tmp_extension == 'JPG' )
{
$img = ImageCreateFromJPEG($imagefile) or die ("Could not create from JPEG");
}
elseif ( $tmp_extension == 'PNG' )
{
$img = ImageCreateFromPNG($imagefile) or die ("Could not create from PNG");
}
else
{
die('the extension '.$tmp_extension.' is not valid, try with JPG or PNG images');
}
$this->width = imagesX($img);
$this->height = imagesY($img);
return $img;
}
/**
* save the image to disk
* @param $img the image stream
* @return void
*/
function save_image($img)
{
if (strtoupper($this->extension) == 'JPG' )
{
$this->image_name = substr($this->image_name, 0, -4) . '.jpg';
ImageJPEG($img, $this->thumbnail_dir_internal . $this->image_name);
}
elseif (strtoupper($this->extension) == 'PNG' )
{
$this->image_name = substr($this->image_name, 0, -4) . '.png';
ImagePNG($img, $this->thumbnail_dir_internal . $this->image_name);
}
else
{
die('the extension '.$this->extension.' is not valid, try with JPG or PNG');
}
}
/**
* delete a thumbnail or watermark file image from the thumbnail_dir_internal
* @param $imagefile the image filename
* @return void
*/
function delete_image($imagefile)
{
$this->image_name = basename($imagefile);
if (is_file($this->thumbnail_dir_internal . $this->image_name))
{
unlink($this->thumbnail_dir_internal . $this->image_name);
}
else
{
die('file does not exist');
}
}
} //end watermark class
?>
Hope this helps -T
Tested with 1.3.1Or download the zip: