Go Back   vb.org Archive > vBulletin Modifications > Archive > vB.org Archives > vBulletin 3.6 > vBulletin 3.6 Add-ons
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools
Attached Image Watermarking PLUS Guest Viewing of Thumbnails Details »»
Attached Image Watermarking PLUS Guest Viewing of Thumbnails
Version: 1.00, by ConqSoft ConqSoft is offline
Developer Last Online: Mar 2012 Show Printable Version Email this Page

Category: Add-On Releases - Version: 3.6.8 Rating:
Released: 03-11-2007 Last Update: 03-12-2007 Installs: 210
Uses Plugins
Additional Files  
No support by the author.

I had been looking for these two options for quite a while, and was finally able to hire Brian (of vBadvanced) to write them for me. Since a lot of people have been looking for this, I have decided (with Brian's permission) to release this as a free, unsupported, modification.

This modification will allow you to specify a watermark image that will be overlayed over any attached JPG or PNG file on your site in real time, as the image is displayed. NO PERMANENT CHANGES ARE MADE TO ANY OF YOUR ATTACHMENTS. You can also exclude specific forums and usergroups from seeing the watermark.

As an added bonus, he included the ability to allow guests to see attached image thumbnails, while still requiring them to register to see the full size attachments. (Make sure you have your Unregistered / Not Logged In usergroup set to NOT have access to download attachments.)

PLEASE CLICK INSTALL so that maybe Jelsoft will include these as built-in features in a future version.

Notes/Troubleshooting:
  • Your server needs to have GD2 installed.
  • Attachments must be stored in the file system. Database storage of file attachments will not work.
  • Make sure you use the full PHYSICAL path to your watermark image.
  • Make sure you have a low number in the width/height setting. (I use 200, since my watermark image is 150 pixels wide.)
  • If you have previously viewed the attached image, your browser may cache it, so you will need to clear your browser cache or force a hard refresh (CTRL-F5) while viewing the image to get the new watermarked version.


Well, on to the modification:

=============================================
STEP 1:
Since the resulting file contains too much vBulletin code, I am unable to include it with this modification. So, the first step is to copy vBulletin's attachment.php to a file named attachment_watermark.php. Then, edit attachment_watermark.php, making the following changes.

=============================================
STEP 2:
You need to delete a LOT of lines from the top of the file. Find this line...
Code:
$idname = $vbphrase['attachment'];
...and delete everything ABOVE it other than the <?php line at the top of the file.

Your attachment_watermark.php file should begin with this code when you've completed this step:
Code:
<?php
$idname = $vbphrase['attachment'];

=============================================
STEP 3:
Find this line of code:
Code:
if (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canview']) OR !($forumperms & $vbulletin->bf_ugp_forumpermissions['canviewthreads']) OR !($forumperms & $vbulletin->bf_ugp_forumpermissions['cangetattachment']) OR (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canviewothers']) AND ($attachmentinfo['postuserid'] != $vbulletin->userinfo['userid'] OR $vbulletin->userinfo['userid'] == 0)))
REPLACE with this code:
Code:
if (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canview']) OR !($forumperms & $vbulletin->bf_ugp_forumpermissions['canviewthreads']) OR (!($forumperms & $vbulletin->bf_ugp_forumpermissions['cangetattachment']) AND !$vbulletin->GPC['thumb'])  OR (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canviewothers']) AND ($attachmentinfo['postuserid'] != $vbulletin->userinfo['userid'] OR $vbulletin->userinfo['userid'] == 0)))

=============================================
STEP 4:
Find these lines of code:
Code:
	else
	{
		$attachpath = fetch_attachment_path($attachmentinfo['userid'], $attachmentinfo['attachmentid']);
Add this code BELOW the lines referenced above:
Code:
// #########################################
// ##### Start modified section for watermarks
// #########################################

$vbulletin->options['attach_water_exforums'] = explode(',', $vbulletin->options['attach_water_exforums']);
$vbulletin->options['attach_water_exgroups'] = explode(',', $vbulletin->options['attach_water_exgroups']);


if ($vbulletin->options['attach_water_filelocation']
	AND in_array($extension, array('jpg', 'jpeg', 'png'))
	AND !in_array($attachmentinfo['forumid'], $vbulletin->options['attach_water_exforums'])
	AND !array_intersect(fetch_membergroupids_array($vbulletin->userinfo), $vbulletin->options['attach_water_exgroups'])
)
{
	$attachsize = getimagesize($attachpath);

	if ($attachsize[0] >= $vbulletin->options['attach_water_minsize'] AND $attachsize[1] >= $vbulletin->options['attach_water_minsize'])
	{
		$waterimage =& $vbulletin->options['attach_water_filelocation'];
		$watersize = getimagesize($waterimage);

		$waterext = strtolower(substr($waterimage, strrpos($waterimage, '.') + 1));

		// Coordinates (height)
		switch ($vbulletin->options['attach_water_coordinates'][0])
		{
			case 'n':
				$waterpos['height'] = 0 + $vbulletin->options['attach_water_padding'];
			break;
			case 'm':
				$waterpos['height'] = round(($attachsize[1] - $watersize[1]) / 2);
			break;
			case 's':
				$waterpos['height'] = round(($attachsize[1] - $watersize[1])) - $vbulletin->options['attach_water_padding'];
			break;
		}

		// Coordinates (width)
		switch ($vbulletin->options['attach_water_coordinates'][1])
		{
			case 'w':
				$waterpos['width'] = 0 + $vbulletin->options['attach_water_padding'];
			break;
			case 'c':
				$waterpos['width'] = round(($attachsize[0] - $watersize[0]) / 2);
			break;
			case 'e':
				$waterpos['width'] = round(($attachsize[0] - $watersize[0])) - $vbulletin->options['attach_water_padding'];
			break;
		}

		// Watermark ext
		switch ($waterext)
		{
			case 'jpg':
			case 'jpeg':
				$watermark = imagecreatefromjpeg($waterimage);
			break;

			case 'png':
				$watermark = imagecreatefrompng($waterimage);
			break;
		}

		// Attachment ext
		switch ($extension)
		{
			case 'jpg':
			case 'jpeg':
				$attachimage = imagecreatefromjpeg($attachpath);
			break;

			case 'png':
				$attachimage = imagecreatefrompng($attachpath);
			break;
		}

		imagealphablending($attachimage, true);

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

		imagecopy($attachimage, $watermark, $waterpos['width'], $waterpos['height'], 0, 0, $watersize[0], $watersize[1]);
		define('WATERMARKED', true);
	}
}
// #########################################
// ##### End modified section for watermarks
// #########################################

=============================================
STEP 5:
Find this line of code:
Code:
header('Content-Length: ' . (($lastbyte + 1) - $startbyte));
REPLACE with this code:
Code:
// #########################################
// ##### Start modified section for watermarks
// ##### Changed to prevent filesize header on watermarked images
// #########################################
if (!defined('WATERMARKED'))
{
	header('Content-Length: ' . (($lastbyte + 1) - $startbyte));
}
// #########################################
// ##### End modified section for watermarks
// #########################################

=============================================
STEP 6:
Find this line of code:
Code:
($hook = vBulletinHook::fetch_hook('attachment_display')) ? eval($hook) : false;
REPLACE with this code:
Code:
// #########################################
// ##### Start modified section for watermarks
// #########################################
if (!$vbulletin->GPC['thumb'] AND defined('WATERMARKED'))
{
	imagejpeg($attachimage);
	imagedestroy($attachimage);
	imagedestroy($watermark);
}
// #########################################
// ##### End modified section for watermarks
=============================================
STEP 7:
Find this line of code:
Code:
($hook = vBulletinHook::fetch_hook('attachment_complete')) ? eval($hook) : false;
REPLACE with this code:
Code:
exit;

=============================================
STEP 8:
Save and upload attachment_watermark.php to your forum root directory.


=============================================
STEP 9:
Install the product-attach_watermark.xml Product via the vBulletin AdminCP Product Manager.


=============================================
STEP 10:
Configure the options at AdminCP -> vBulletin Options -> Attachment Watermarks. All fields should be self-explanatory.

Show Your Support

  • This modification may not be copied, reproduced or published elsewhere without author's permission.

Comments
  #82  
Old 04-27-2007, 04:51 AM
Bulent Tekcan Bulent Tekcan is offline
 
Join Date: Oct 2003
Location: TURKEY - Istanbul
Posts: 437
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Ntfu2 View Post
You can't watermark images that are not on your server.
How can I use watermark on our server without vBulletin attachment system.For example I need watermark ../testimages/ directory on my server.

Any idea for that ?
Reply With Quote
  #83  
Old 04-27-2007, 07:02 AM
bjhuang bjhuang is offline
 
Join Date: Jul 2006
Posts: 77
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

i mean how to watermark only the attachments on my server that have been linked by other sites. i want to keep the images as it is when browsing by my members. but if the images were "stolen", i want them to be watermarked.

Quote:
Originally Posted by Ntfu2 View Post
You can't watermark images that are not on your server.
Reply With Quote
  #84  
Old 04-27-2007, 11:05 AM
bjhuang bjhuang is offline
 
Join Date: Jul 2006
Posts: 77
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

to support gif

PHP Code:
[OPEN]
attachment_watermark.php

[FIND]
    AND 
in_array($extension, array('jpg''jpeg''png')) 

[
REPLACE]
    AND 
in_array($extension, array('jpg''jpeg''png''gif'))
    
[
FIND]
                
$watermark imagecreatefrompng($waterimage);

[
ADD AFTER]
            break;
            case 
'gif':
                
$watermark imagecreatefromgif($waterimage);

[
FIND]
                
$attachimage imagecreatefrompng($attachpath);

[
ADD AFTER]
            break;
            case 
'gif':
                
$attachimage imagecreatefromgif($attachpath); 
Reply With Quote
  #85  
Old 05-01-2007, 04:28 PM
datarecall datarecall is offline
 
Join Date: Aug 2006
Posts: 38
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

worked excellent quick note to people that are trying this
dont use a transparent gif for your water mark you will get a bunch of errors
i put my watermark in the root directory because for some reason i got errors when putting it into images/watermark.png

thanks for the mod it works great.
Reply With Quote
  #86  
Old 05-19-2007, 04:13 PM
Pottsy Pottsy is offline
 
Join Date: Sep 2006
Location: UK
Posts: 130
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

A while ago I posted about poor image quality with the watermark on.

I fixed this by finding this in attachment_watermark.php:

Code:
imagejpeg($attachimage);


and replacing it with this:

Code:
imagejpeg($attachimage,"",93);
The 93 is the quality of the output, with 100 as max and 50 as grotty.

HTH
Reply With Quote
  #87  
Old 05-19-2007, 04:14 PM
ConqSoft's Avatar
ConqSoft ConqSoft is offline
 
Join Date: Jul 2003
Location: Raleigh, NC
Posts: 686
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Default quality is 75, and is usually fine.
Reply With Quote
  #88  
Old 05-20-2007, 12:01 PM
Pottsy Pottsy is offline
 
Join Date: Sep 2006
Location: UK
Posts: 130
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default



Those are a 1:1 crop of a detail of a pic uploaded and watermarked at the different quality levels. I saved this compilation at 100% quality to try to minimise the effects of another jpg conversion, but it shows the issue I was having. I was getting complaints...
Reply With Quote
  #89  
Old 06-14-2007, 02:08 PM
ConqSoft's Avatar
ConqSoft ConqSoft is offline
 
Join Date: Jul 2003
Location: Raleigh, NC
Posts: 686
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I don't really see much of a difference between the 75 and the 93. *shrug*
Reply With Quote
  #90  
Old 06-14-2007, 02:47 PM
Kahuna900's Avatar
Kahuna900 Kahuna900 is offline
 
Join Date: Apr 2005
Posts: 50
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I added he hack to allow watermarking of "gif" which worked, but it seems to mess with the transparency of the watermark.png file.
Reply With Quote
  #91  
Old 06-17-2007, 04:05 PM
FleXy FleXy is offline
 
Join Date: Dec 2006
Posts: 81
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

iexampled image isn't realy true color. try image with different colors like HG photo and you will see difference.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 02:24 AM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.12366 seconds
  • Memory Usage 2,337KB
  • Queries Executed 25 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (14)bbcode_code
  • (1)bbcode_php
  • (2)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)modsystem_post
  • (1)navbar
  • (6)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (4)pagenav_pagelink
  • (1)pagenav_pagelinkrel
  • (11)post_thanks_box
  • (11)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (11)post_thanks_postbit_info
  • (10)postbit
  • (11)postbit_onlinestatus
  • (11)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete