summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/_inc/lib/tonesque.php')
-rw-r--r--plugins/jetpack/_inc/lib/tonesque.php237
1 files changed, 237 insertions, 0 deletions
diff --git a/plugins/jetpack/_inc/lib/tonesque.php b/plugins/jetpack/_inc/lib/tonesque.php
new file mode 100644
index 00000000..17158e3d
--- /dev/null
+++ b/plugins/jetpack/_inc/lib/tonesque.php
@@ -0,0 +1,237 @@
+<?php
+/*
+Plugin Name: Tonesque
+Plugin URI: http://automattic.com/
+Description: Grab an average color representation from an image.
+Version: 1.0
+Author: Automattic, Matias Ventura
+Author URI: http://automattic.com/
+License: GNU General Public License v2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+*/
+
+class Tonesque {
+
+ private $image_url = '';
+ private $image_obj = NULL;
+ private $color = '';
+
+ function __construct( $image_url ) {
+ if ( ! class_exists( 'Jetpack_Color' ) ) {
+ jetpack_require_lib( 'class.color' );
+ }
+
+ $this->image_url = esc_url_raw( $image_url );
+ $this->image_url = trim( $this->image_url );
+ /**
+ * Allows any image URL to be passed in for $this->image_url.
+ *
+ * @module theme-tools
+ *
+ * @since 2.5.0
+ *
+ * @param string $image_url The URL to any image
+ */
+ $this->image_url = apply_filters( 'tonesque_image_url', $this->image_url );
+
+ $this->image_obj = self::imagecreatefromurl( $this->image_url );
+ }
+
+ public static function imagecreatefromurl( $image_url ) {
+ $data = null;
+
+ // If it's a URL:
+ if ( preg_match( '#^https?://#i', $image_url ) ) {
+ // If it's a url pointing to a local media library url:
+ $content_url = content_url();
+ $_image_url = set_url_scheme( $image_url );
+ if ( wp_startswith( $_image_url, $content_url ) ) {
+ $_image_path = str_replace( $content_url, WP_CONTENT_DIR, $_image_url );
+ if ( file_exists( $_image_path ) ) {
+ $filetype = wp_check_filetype( $_image_path );
+ $ext = $filetype['ext'];
+ $type = $filetype['type'];
+
+ if ( wp_startswith( $type, 'image/' ) ) {
+ $data = file_get_contents( $_image_path );
+ }
+ }
+ }
+
+ if ( empty( $data ) ) {
+ $response = wp_remote_get( $image_url );
+ if ( is_wp_error( $response ) ) {
+ return false;
+ }
+ $data = wp_remote_retrieve_body( $response );
+ }
+ }
+
+ // If it's a local path in our WordPress install:
+ if ( file_exists( $image_url ) ) {
+ $filetype = wp_check_filetype( $image_url );
+ $ext = $filetype['ext'];
+ $type = $filetype['type'];
+
+ if ( wp_startswith( $type, 'image/' ) ) {
+ $data = file_get_contents( $image_url );
+ }
+ }
+
+ // Now turn it into an image and return it.
+ return imagecreatefromstring( $data );
+ }
+
+ /**
+ *
+ * Construct object from image.
+ *
+ * @param optional $type (hex, rgb, hsv)
+ * @return color as a string formatted as $type
+ *
+ */
+ function color( $type = 'hex' ) {
+ // Bail if there is no image to work with
+ if ( ! $this->image_obj )
+ return false;
+
+ // Finds dominant color
+ $color = self::grab_color();
+ // Passes value to Color class
+ $color = self::get_color( $color, $type );
+ return $color;
+ }
+
+ /**
+ *
+ * Grabs the color index for each of five sample points of the image
+ *
+ * @param $image
+ * @param $type can be 'index' or 'hex'
+ * @return array() with color indices
+ *
+ */
+ function grab_points( $type = 'index' ) {
+ $img = $this->image_obj;
+ if ( ! $img )
+ return false;
+
+ $height = imagesy( $img );
+ $width = imagesx( $img );
+
+ // Sample five points in the image
+ // Based on rule of thirds and center
+ $topy = round( $height / 3 );
+ $bottomy = round( ( $height / 3 ) * 2 );
+ $leftx = round( $width / 3 );
+ $rightx = round( ( $width / 3 ) * 2 );
+ $centery = round( $height / 2 );
+ $centerx = round( $width / 2 );
+
+ // Cast those colors into an array
+ $points = array(
+ imagecolorat( $img, $leftx, $topy ),
+ imagecolorat( $img, $rightx, $topy ),
+ imagecolorat( $img, $leftx, $bottomy ),
+ imagecolorat( $img, $rightx, $bottomy ),
+ imagecolorat( $img, $centerx, $centery ),
+ );
+
+ if ( 'hex' == $type ) {
+ foreach ( $points as $i => $p ) {
+ $c = imagecolorsforindex( $img, $p );
+ $points[ $i ] = self::get_color( array(
+ 'r' => $c['red'],
+ 'g' => $c['green'],
+ 'b' => $c['blue'],
+ ), 'hex' );
+ }
+ }
+
+ return $points;
+ }
+
+ /**
+ *
+ * Finds the average color of the image based on five sample points
+ *
+ * @param $image
+ * @return array() with rgb color
+ *
+ */
+ function grab_color() {
+ $img = $this->image_obj;
+ if ( ! $img )
+ return false;
+
+ $rgb = self::grab_points();
+
+ // Process the color points
+ // Find the average representation
+ foreach ( $rgb as $color ) {
+ $index = imagecolorsforindex( $img, $color );
+ $r[] = $index['red'];
+ $g[] = $index['green'];
+ $b[] = $index['blue'];
+
+ $red = round( array_sum( $r ) / 5 );
+ $green = round( array_sum( $g ) / 5 );
+ $blue = round( array_sum( $b ) / 5 );
+ }
+
+ // The average color of the image as rgb array
+ $color = array(
+ 'r' => $red,
+ 'g' => $green,
+ 'b' => $blue,
+ );
+
+ return $color;
+ }
+
+ /**
+ *
+ * Get a Color object using /lib class.color
+ * Convert to appropriate type
+ *
+ * @return string
+ *
+ */
+ function get_color( $color, $type ) {
+ $c = new Jetpack_Color( $color, 'rgb' );
+ $this->color = $c;
+
+ switch ( $type ) {
+ case 'rgb' :
+ $color = implode( $c->toRgbInt(), ',' );
+ break;
+ case 'hex' :
+ $color = $c->toHex();
+ break;
+ case 'hsv' :
+ $color = implode( $c->toHsvInt(), ',' );
+ break;
+ default:
+ return $color = $c->toHex();
+ }
+
+ return $color;
+ }
+
+ /**
+ *
+ * Checks contrast against main color
+ * Gives either black or white for using with opacity
+ *
+ * @return string
+ *
+ */
+ function contrast() {
+ if ( ! $this->color )
+ return false;
+
+ $c = $this->color->getMaxContrastColor();
+ return implode( $c->toRgbInt(), ',' );
+ }
+
+};