Created
September 1, 2011 23:25
-
-
Save Viper007Bond/1187563 to your computer and use it in GitHub Desktop.
Watermark WordPress Image Uploads
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* Plugin Name: WordPress.com Watermark Image Uploads | |
* Author: Alex Mills | |
* Author URI: http://automattic.com/ | |
*/ | |
class WPcom_Watermark_Uploads { | |
public $watermark; | |
// Class initialization | |
function __construct() { | |
$this->watermark = apply_filters( 'wpcom_watermark_image', STYLESHEETPATH . '/images/upload-watermark.png' ); | |
if ( ! file_exists( $this->watermark ) ) | |
return false; | |
add_filter( 'wp_handle_upload_prefilter', array( &$this, 'handle_file' ), 100 ); | |
add_filter( 'wp_upload_bits_data', array( &$this, 'handle_bits' ), 10, 2 ); // http://core.trac.wordpress.org/ticket/12493 | |
} | |
// For filters that pass a $_FILES array | |
public function handle_file( $file ) { | |
// Make sure the upload is valid | |
if ( 0 == $file['error'] && is_uploaded_file( $file['tmp_name'] ) ) { | |
// Check file extension (can't use $file['type'] due to Flash uploader sending application/octet-stream) | |
if ( ! $type = $this->get_type( $file['name'] ) ) { | |
return $file; | |
} | |
// Load the image into $image | |
switch ( $type ) { | |
case 'jpeg': | |
if ( ! $image = @imagecreatefromjpeg( $file['tmp_name'] ) ) { | |
return $file; | |
} | |
// Get the JPEG quality setting of the original image | |
if ( $imagecontent = @file_get_contents( $file['tmp_name'] ) ) | |
$quality = $this->get_jpeg_quality_wrapper( $imagecontent ); | |
if ( empty( $quality ) ) | |
$quality = 90; | |
break; | |
case 'png': | |
if ( !$image = @imagecreatefrompng( $file['tmp_name'] ) ) { | |
return $file; | |
} | |
break; | |
default; | |
return $file; | |
} | |
// Run the $image through the watermarker | |
$image = $this->watermark( $image ); | |
// Save the new watermarked image | |
switch ( $type ) { | |
case 'jpeg': | |
imagejpeg( $image, $file['tmp_name'], $quality ); | |
case 'png': | |
imagepng( $image, $file['tmp_name'] ); | |
} | |
imagedestroy( $image ); | |
} | |
return $file; | |
} | |
// For filters that pass the image as a string | |
public function handle_bits( $bits, $file ) { | |
// Check file extension | |
if ( ! $type = $this->get_type( $file ) ) { | |
return $bits; | |
} | |
// Convert the $bits into an $image | |
if ( ! $image = imagecreatefromstring( $bits ) ) { | |
return $bits; | |
} | |
// Run the $image through the watermarker | |
$image = $this->watermark( $image ); | |
// Get the $image back into a string | |
ob_start(); | |
switch ( $type ) { | |
case 'jpeg': | |
// Get the JPEG quality setting of the original image | |
$quality = $this->get_jpeg_quality_wrapper( $bits ); | |
if ( empty($quality) ) | |
$quality = 100; | |
if ( ! imagejpeg( $image, null, $quality ) ) { | |
ob_end_clean(); | |
return $bits; | |
} | |
break; | |
case 'png': | |
if ( ! imagepng( $image ) ) { | |
ob_end_clean(); | |
return $bits; | |
} | |
break; | |
default; | |
ob_end_clean(); | |
return $bits; | |
} | |
$bits = ob_get_contents(); | |
ob_end_clean(); | |
imagedestroy( $image ); | |
return $bits; | |
} | |
// Watermarks an $image | |
public function watermark( $image ) { | |
// Load the watermark into $watermark | |
if ( ! $watermark = @imagecreatefrompng( $this->watermark ) ) { | |
return $image; | |
} | |
// Get the original image dimensions | |
$image_width = imagesx( $image ); | |
$image_height = imagesy( $image ); | |
// Get the watermark dimensions | |
$watermark_width = imagesx( $watermark ); | |
$watermark_height = imagesy( $watermark ); | |
// Calculate watermark location (see docs for help with these filters) | |
$dest_x = (int) apply_filters( 'wpcom_watermark_uploads_destx', $image_width - $watermark_width - 5, $image_width, $watermark_width ); | |
$dest_y = (int) apply_filters( 'wpcom_watermark_uploads_desty', $image_height - $watermark_height - 5, $image_height, $watermark_height ); | |
// Copy the watermark onto the original image | |
imagecopy( $image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height ); | |
imagedestroy( $watermark ); | |
return $image; | |
} | |
// Safety wrapper for our get_jpeg_quality() function | |
// See http://blog.apokalyptik.com/2009/09/16/quality-time-with-your-jpegs/ | |
public function get_jpeg_quality_wrapper( $imagecontent ) { | |
$quality = false; | |
if ( ! function_exists( 'get_jpeg_quality' ) ) | |
@include_once( WP_PLUGIN_DIR . '/wpcom-images/libjpeg.php' ); | |
if ( function_exists( 'get_jpeg_quality' ) ) | |
$quality = get_jpeg_quality( $imagecontent ); | |
return $quality; | |
} | |
// Figure out image type based on filename | |
public function get_type( $filename ) { | |
$wp_filetype = wp_check_filetype( $filename ); | |
switch ( $wp_filetype['ext'] ) { | |
case 'png': | |
return 'png'; | |
case 'jpg': | |
case 'jpeg': | |
return 'jpeg'; | |
default; | |
return false; | |
} | |
} | |
} | |
// Start this plugin once everything else is loaded up | |
add_action( 'init', 'WPcom_Watermark_Uploads', 5 ); | |
function WPcom_Watermark_Uploads() { | |
global $WPcom_Watermark_Uploads; | |
$WPcom_Watermark_Uploads = new WPcom_Watermark_Uploads(); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Wasn't aware of that constant STYLESHEETPATH existing. Thanks I learnt something :)