PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.3.2
Jetpack – WP Security, Backup, Speed, & Growth v12.3.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / lib / tonesque.php
jetpack / _inc / lib Last commit date
admin-pages 3 years ago core-api 3 years ago debugger 3 years ago markdown 4 years ago class-jetpack-ai-helper.php 3 years ago class-jetpack-currencies.php 5 years ago class-jetpack-google-drive-helper.php 3 years ago class-jetpack-instagram-gallery-helper.php 3 years ago class-jetpack-mapbox-helper.php 3 years ago class-jetpack-podcast-feed-locator.php 5 years ago class-jetpack-podcast-helper.php 3 years ago class-jetpack-recommendations.php 3 years ago class-jetpack-tweetstorm-helper.php 3 years ago class-jetpack-wizard.php 5 years ago class.color.php 4 years ago class.core-rest-api-endpoints.php 3 years ago class.jetpack-automatic-install-skin.php 4 years ago class.jetpack-iframe-embed.php 3 years ago class.jetpack-keyring-service-helper.php 3 years ago class.jetpack-password-checker.php 3 years ago class.jetpack-search-performance-logger.php 4 years ago class.media-extractor.php 3 years ago class.media-summary.php 3 years ago class.media.php 3 years ago components.php 3 years ago debugger.php 4 years ago functions.wp-notify.php 3 years ago icalendar-reader.php 3 years ago markdown.php 3 years ago plans.php 4 years ago plugins.php 4 years ago tonesque.php 3 years ago widgets.php 4 years ago
tonesque.php
270 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Tonesque
4 * Grab an average color representation from an image.
5 *
6 * @author Automattic
7 * @author Matias Ventura
8 * @package automattic/jetpack
9 */
10
11 /**
12 * Color representation class.
13 */
14 class Tonesque {
15 /**
16 * Image URL.
17 *
18 * @var string
19 */
20 private $image_url = '';
21 /**
22 * Image identifier representing the image.
23 *
24 * @var null|object
25 */
26 private $image_obj = null;
27 /**
28 * Color code.
29 *
30 * @var string
31 */
32 private $color = '';
33
34 /**
35 * Constructor.
36 *
37 * @param string $image_url Image URL.
38 */
39 public function __construct( $image_url ) {
40 if ( ! class_exists( 'Jetpack_Color' ) ) {
41 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class.color.php';
42 }
43
44 $this->image_url = esc_url_raw( $image_url );
45 $this->image_url = trim( $this->image_url );
46 /**
47 * Allows any image URL to be passed in for $this->image_url.
48 *
49 * @module theme-tools
50 *
51 * @since 2.5.0
52 *
53 * @param string $image_url The URL to any image
54 */
55 $this->image_url = apply_filters( 'tonesque_image_url', $this->image_url );
56
57 $this->image_obj = self::imagecreatefromurl( $this->image_url );
58 }
59
60 /**
61 * Get an image object from a URL.
62 *
63 * @param string $image_url Image URL.
64 *
65 * @return object|bool Image object or false if the image could not be loaded.
66 */
67 public static function imagecreatefromurl( $image_url ) {
68 $data = null;
69
70 // If it's a URL.
71 if ( preg_match( '#^https?://#i', $image_url ) ) {
72 // If it's a url pointing to a local media library url.
73 $content_url = content_url();
74 $_image_url = set_url_scheme( $image_url );
75 if ( wp_startswith( $_image_url, $content_url ) ) {
76 $_image_path = str_replace( $content_url, WP_CONTENT_DIR, $_image_url );
77 if ( file_exists( $_image_path ) ) {
78 $filetype = wp_check_filetype( $_image_path );
79 $type = $filetype['type'];
80
81 if ( wp_startswith( $type, 'image/' ) ) {
82 $data = file_get_contents( $_image_path ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
83 }
84 }
85 }
86
87 if ( empty( $data ) ) {
88 $response = wp_safe_remote_get( $image_url );
89 if ( is_wp_error( $response ) ) {
90 return false;
91 }
92 $data = wp_remote_retrieve_body( $response );
93 }
94 }
95
96 // If it's a local path in our WordPress install.
97 if ( file_exists( $image_url ) ) {
98 $filetype = wp_check_filetype( $image_url );
99 $type = $filetype['type'];
100
101 if ( wp_startswith( $type, 'image/' ) ) {
102 $data = file_get_contents( $image_url ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
103 }
104 }
105
106 // Now turn it into an image and return it.
107 return imagecreatefromstring( $data );
108 }
109
110 /**
111 * Construct object from image.
112 *
113 * @param string $type Type (hex, rgb, hsv) (optional).
114 *
115 * @return string|bool color as a string formatted as $type or false if the image could not be loaded.
116 */
117 public function color( $type = 'hex' ) {
118 // Bail if there is no image to work with.
119 if ( ! $this->image_obj ) {
120 return false;
121 }
122
123 // Finds dominant color.
124 $color = self::grab_color();
125 // Passes value to Color class.
126 return self::get_color( $color, $type );
127 }
128
129 /**
130 * Grabs the color index for each of five sample points of the image
131 *
132 * @param string $type can be 'index' or 'hex'.
133 *
134 * @return array|false color indices or false if the image could not be loaded.
135 */
136 public function grab_points( $type = 'index' ) {
137 $img = $this->image_obj;
138 if ( ! $img ) {
139 return false;
140 }
141
142 $height = imagesy( $img );
143 $width = imagesx( $img );
144
145 /*
146 * Sample five points in the image
147 * based on rule of thirds and center.
148 */
149 $topy = round( $height / 3 );
150 $bottomy = round( ( $height / 3 ) * 2 );
151 $leftx = round( $width / 3 );
152 $rightx = round( ( $width / 3 ) * 2 );
153 $centery = round( $height / 2 );
154 $centerx = round( $width / 2 );
155
156 // Cast those colors into an array.
157 $points = array(
158 imagecolorat( $img, $leftx, $topy ),
159 imagecolorat( $img, $rightx, $topy ),
160 imagecolorat( $img, $leftx, $bottomy ),
161 imagecolorat( $img, $rightx, $bottomy ),
162 imagecolorat( $img, $centerx, $centery ),
163 );
164
165 if ( 'hex' === $type ) {
166 foreach ( $points as $i => $p ) {
167 $c = imagecolorsforindex( $img, $p );
168 $points[ $i ] = self::get_color(
169 array(
170 'r' => $c['red'],
171 'g' => $c['green'],
172 'b' => $c['blue'],
173 ),
174 'hex'
175 );
176 }
177 }
178
179 return $points;
180 }
181
182 /**
183 * Finds the average color of the image based on five sample points
184 *
185 * @return array|bool array with rgb color or false if the image could not be loaded.
186 */
187 public function grab_color() {
188 $img = $this->image_obj;
189 if ( ! $img ) {
190 return false;
191 }
192
193 $rgb = self::grab_points();
194
195 $r = array();
196 $g = array();
197 $b = array();
198
199 /*
200 * Process the color points
201 * Find the average representation
202 */
203 foreach ( $rgb as $color ) {
204 $index = imagecolorsforindex( $img, $color );
205 $r[] = $index['red'];
206 $g[] = $index['green'];
207 $b[] = $index['blue'];
208 }
209 $red = round( array_sum( $r ) / 5 );
210 $green = round( array_sum( $g ) / 5 );
211 $blue = round( array_sum( $b ) / 5 );
212
213 // The average color of the image as rgb array.
214 $color = array(
215 'r' => $red,
216 'g' => $green,
217 'b' => $blue,
218 );
219
220 return $color;
221 }
222
223 /**
224 * Get a Color object using /lib class.color
225 * Convert to appropriate type
226 *
227 * @param string $color Color code.
228 * @param string $type Color type (rgb, hex, hsv).
229 *
230 * @return string
231 */
232 public function get_color( $color, $type ) {
233 $c = new Jetpack_Color( $color, 'rgb' );
234 $this->color = $c;
235
236 switch ( $type ) {
237 case 'rgb':
238 $color = implode( ',', $c->toRgbInt() );
239 break;
240 case 'hex':
241 $color = $c->toHex();
242 break;
243 case 'hsv':
244 $color = implode( ',', $c->toHsvInt() );
245 break;
246 default:
247 return $c->toHex();
248 }
249
250 return $color;
251 }
252
253 /**
254 *
255 * Checks contrast against main color
256 * Gives either black or white for using with opacity
257 *
258 * @return string|bool Returns black or white or false if the image could not be loaded.
259 */
260 public function contrast() {
261 if ( ! $this->color ) {
262 return false;
263 }
264
265 $c = $this->color->getMaxContrastColor();
266 return implode( ',', $c->toRgbInt() );
267 }
268
269 }
270