VirtueMart Forum

VirtueMart 2 + 3 + 4 => General Questions => Topic started by: raunhar on May 18, 2017, 12:49:13 PM

Title: Product image watermarking
Post by: raunhar on May 18, 2017, 12:49:13 PM
Is there any plugin for virtuemart, which can add Watermarks to the product images.
Title: Re: Product image watermarking
Post by: jenkinhill on May 18, 2017, 13:48:10 PM
http://bfy.tw/BrWt
Title: Re: Product image watermarking
Post by: Ventsi Genchev on May 19, 2017, 16:11:33 PM
No plugin needed. It can only be done with a htaccess.
Title: Re: Product image watermarking
Post by: raunhar on May 19, 2017, 16:29:35 PM
Please suggest the code to be added to htaccess

Sent from my Moto G (4) using Tapatalk

Title: Re: Product image watermarking
Post by: Ventsi Genchev on May 19, 2017, 17:41:01 PM
I made changes to this (thanks to Andre Catita for sharing):
https://github.com/andreCatita/imageWatermark

Required files are:
1. watermark.png (Some kind of your picture).

2. Changed by me watermark.php
<?php

/**
 *
 * PHP Image Watermark
 * Copyright (c) 2013 Andr顃atita http://andrecatita.com
 * http://github.com/andreCatita/
 *
 * GNU General Public License, version 2 (GPL-2.0)
 * http://opensource.org/licenses/GPL-2.0
 *
 */

// Configuration
$options = array(
    
'WATERMARK_IMAGE'     => ' watermark.png', // The location and name of the watermark  (If using ready a ready .PNG or .GIF set WATERMARK_IS_READY to TRUE)
    
'WATERMARK_OPACITY'     => '45', // The opacity the image will be merged with, this doesn't apply to WATERMARK_IS_READY
    
'WATERMARK_QUALITY'     => '100', // Image Quality - 0 to 100 - Higher is better
    
'WATERMARK_IS_READY'     => TRUE, // If your watermark image is already a .png or .gif with transparency set, set this to TRUE
    
'WATERMARK_PLACE'     => 'CENTER', // This value accepts -> BOTTOM_RIGHT, BOTTOM_LEFT, TOP_LEFT, TOP_RIGHT, CENTER, CENTER_LEFT, CENTER_RIGHT
    
'WATERMARK_MARGIN'     => '10',
);

function 
createImageFromFile($full_or_relative_path_to_image) {

    list(,, 
$image_type) = getimagesize($full_or_relative_path_to_image);

    if (
$image_type === NULL) {
return null;
    }

    switch (
$image_type) {
case IMAGETYPE_GIF:
    return imagecreatefromgif($full_or_relative_path_to_image);
    break;
case IMAGETYPE_JPEG:
    return imagecreatefromjpeg($full_or_relative_path_to_image);
    break;
case IMAGETYPE_PNG:
    return imagecreatefrompng($full_or_relative_path_to_image);
    break;
default:
    return null;
    break;
    }
}

// Overwrite Defaults
$original_image = (isset($_GET['image']) $_GET['image']     : null);
$watermark_image = (isset($_GET['watermark']) $_GET['watermark']     : $options['WATERMARK_IMAGE']);
$place = (isset($_GET['place']) $_GET['place']     : $options['WATERMARK_PLACE']);
$margin = (isset($_GET['margin']) $_GET['margin']     : $options['WATERMARK_MARGIN']);
$quality = (isset($_GET['quality']) $_GET['quality']     : $options['WATERMARK_QUALITY']);
$is_watermark_ready = (isset($_GET['is_ready']) ? ($_GET['is_ready'] == 'true' TRUE FALSE) : $options['WATERMARK_IS_READY']);

// Load Image & Watermark
$image createImageFromFile($original_image);
$watermark createImageFromFile($watermark_image);
if (!
$image || !$watermark)
    exit;

/*
 *  Math for watermark positions
 * - to avoid use down the road of php: imagesx and imagesy
 * - which can be used to obtain both height and width of the $image and $watermark element
 */

$watermark_width imagesx($watermark);
$watermark_height imagesy($watermark);

$image_width imagesx($image);
$image_height imagesy($image);

$watermark_pos_x $image_width -   $watermark_width;
$watermark_pos_y $image_height -   $watermark_height;

switch (
$place) {
    case 
'BOTTOM_LEFT':
if ($is_watermark_ready) {
    imagecopy($image$watermark$margin$watermark_pos_y $margin00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$margin$watermark_pos_y $margin00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'BOTTOM_CENTER':
if ($is_watermark_ready) {
    imagecopy($image$watermark, ($watermark_pos_x 2), $watermark_pos_y $margin00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$watermark_pos_x $margin$watermark_pos_y $margin00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'BOTTOM_RIGHT':
if ($is_watermark_ready) {
    imagecopy($image$watermark$watermark_pos_x $margin$watermark_pos_y $margin00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$watermark_pos_x $margin$watermark_pos_y $margin00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'TOP_LEFT':
if ($is_watermark_ready) {
    imagecopy($image$watermark$margin$margin00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$margin$margin00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'TOP_CENTER':
if ($is_watermark_ready) {
    imagecopy($image$watermark, ($watermark_pos_x 2), $margin00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$watermark_pos_x $margin$margin00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'TOP_RIGHT':
if ($is_watermark_ready) {
    imagecopy($image$watermark$watermark_pos_x $margin$margin00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$watermark_pos_x $margin$margin00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'CENTER':
if ($is_watermark_ready) {
    imagecopy($image$watermark, ($watermark_pos_x 2), ($watermark_pos_y 2), 00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark, ($watermark_pos_x 2), ($watermark_pos_y 2), 00$watermark_width$options['WATERMARK_OPACITY']);
}
break;
    case 
'CENTER_LEFT':
if ($is_watermark_ready) {
    imagecopy($image$watermark$margin, ($watermark_pos_y 2), 00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$margin, ($watermark_pos_y 2), 00$watermark_width$watermark_height$options['WATERMARK_OPACITY']);
}
break;
    case 
'CENTER_RIGHT':
if ($is_watermark_ready) {
    imagecopy($image$watermark$watermark_pos_x $margin, ($watermark_pos_y 2), 00$watermark_width$watermark_height);
} else {
    imagecopymerge($image$watermark$watermark_pos_x $margin, ($watermark_pos_y 2), 00$watermark_width$options['WATERMARK_OPACITY']);
}
break;
}

// Output JPEG
header('Content-Type: image/jpeg');
imagejpeg($imagenull$quality);

// Clear Memory
imagedestroy($image);
imagedestroy($watermark);
?>


3. And .htaccess file:
RewriteEngine on
RewriteRule ^(resized) - [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*\.(gif|jp?g|png))$ watermark.php?image=$1&watermark=watermark.png [NC]


Put the three files in the product photo folder. For example: images/stories/virtuemart/product. Or where they are set.
To test you can download the picture watermark.png from the link at the top.
I've added a rule in the .htaccess that forbids the watermark for resized photos.

That is all. I wish you success!