PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.7.2
Jetpack – WP Security, Backup, Speed, & Growth v13.7.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 2 years ago core-api 2 years ago debugger 2 years ago markdown 2 years ago class-jetpack-ai-helper.php 2 years ago class-jetpack-currencies.php 2 years ago class-jetpack-google-drive-helper.php 2 years ago class-jetpack-instagram-gallery-helper.php 2 years ago class-jetpack-mapbox-helper.php 3 years ago class-jetpack-podcast-feed-locator.php 2 years ago class-jetpack-podcast-helper.php 2 years ago class-jetpack-recommendations.php 2 years ago class-jetpack-top-posts-helper.php 2 years ago class.color.php 2 years ago class.core-rest-api-endpoints.php 2 years ago class.jetpack-automatic-install-skin.php 2 years ago class.jetpack-iframe-embed.php 3 years ago class.jetpack-keyring-service-helper.php 2 years ago class.jetpack-password-checker.php 2 years ago class.jetpack-search-performance-logger.php 4 years ago class.media-extractor.php 2 years ago class.media-summary.php 2 years ago class.media.php 2 years ago components.php 3 years ago debugger.php 2 years ago functions.wp-notify.php 2 years ago icalendar-reader.php 2 years ago markdown.php 3 years ago plans.php 4 years ago plugins.php 4 years ago tonesque.php 2 years ago widgets.php 2 years ago
tonesque.php
281 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 if ( ! class_exists( 'Tonesque' ) ) {
12 /**
13 * Color representation class.
14 */
15 class Tonesque {
16 /**
17 * Image URL.
18 *
19 * @var string
20 */
21 private $image_url = '';
22 /**
23 * Image identifier representing the image.
24 *
25 * @var null|object
26 */
27 private $image_obj = null;
28 /**
29 * Color code.
30 *
31 * @var string
32 */
33 private $color = '';
34
35 /**
36 * Constructor.
37 *
38 * @param string $image_url Image URL.
39 */
40 public function __construct( $image_url ) {
41 if ( ! class_exists( 'Jetpack_Color' ) ) {
42 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class.color.php';
43 }
44
45 $this->image_url = esc_url_raw( $image_url );
46 $this->image_url = trim( $this->image_url );
47 /**
48 * Allows any image URL to be passed in for $this->image_url.
49 *
50 * @module theme-tools
51 *
52 * @since 2.5.0
53 *
54 * @param string $image_url The URL to any image
55 */
56 $this->image_url = apply_filters( 'tonesque_image_url', $this->image_url );
57
58 $this->image_obj = self::imagecreatefromurl( $this->image_url );
59 }
60
61 /**
62 * Get an image object from a URL.
63 *
64 * @param string $image_url Image URL.
65 *
66 * @return object|bool Image object or false if the image could not be loaded.
67 */
68 public static function imagecreatefromurl( $image_url ) {
69 $data = null;
70
71 // If it's a URL.
72 if ( preg_match( '#^https?://#i', $image_url ) ) {
73 // If it's a url pointing to a local media library url.
74 $content_url = content_url();
75 $_image_url = set_url_scheme( $image_url );
76 if ( str_starts_with( $_image_url, $content_url ) ) {
77 $_image_path = str_replace( $content_url, WP_CONTENT_DIR, $_image_url );
78 if ( file_exists( $_image_path ) ) {
79 $filetype = wp_check_filetype( $_image_path );
80 $type = $filetype['type'];
81
82 if ( str_starts_with( $type, 'image/' ) ) {
83 $data = file_get_contents( $_image_path ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
84 }
85 }
86 }
87
88 if ( empty( $data ) ) {
89 $response = wp_safe_remote_get( $image_url );
90 $response_code = wp_remote_retrieve_response_code( $response );
91 if (
92 is_wp_error( $response )
93 || ! $response_code
94 || $response_code < 200
95 || $response_code >= 300
96 ) {
97 return false;
98 }
99 $data = wp_remote_retrieve_body( $response );
100 }
101 }
102
103 // If it's a local path in our WordPress install.
104 if ( file_exists( $image_url ) ) {
105 $filetype = wp_check_filetype( $image_url );
106 $type = $filetype['type'];
107
108 if ( str_starts_with( $type, 'image/' ) ) {
109 $data = file_get_contents( $image_url ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
110 }
111 }
112
113 if ( null === $data ) {
114 return false;
115 }
116
117 // Now turn it into an image and return it.
118 return imagecreatefromstring( $data );
119 }
120
121 /**
122 * Construct object from image.
123 *
124 * @param string $type Type (hex, rgb, hsv) (optional).
125 *
126 * @return string|bool color as a string formatted as $type or false if the image could not be loaded.
127 */
128 public function color( $type = 'hex' ) {
129 // Bail if there is no image to work with.
130 if ( ! $this->image_obj ) {
131 return false;
132 }
133
134 // Finds dominant color.
135 $color = self::grab_color();
136 // Passes value to Color class.
137 return self::get_color( $color, $type );
138 }
139
140 /**
141 * Grabs the color index for each of five sample points of the image
142 *
143 * @param string $type can be 'index' or 'hex'.
144 *
145 * @return array|false color indices or false if the image could not be loaded.
146 */
147 public function grab_points( $type = 'index' ) {
148 $img = $this->image_obj;
149 if ( ! $img ) {
150 return false;
151 }
152
153 $height = imagesy( $img );
154 $width = imagesx( $img );
155
156 /*
157 * Sample five points in the image
158 * based on rule of thirds and center.
159 */
160 $topy = round( $height / 3 );
161 $bottomy = round( ( $height / 3 ) * 2 );
162 $leftx = round( $width / 3 );
163 $rightx = round( ( $width / 3 ) * 2 );
164 $centery = round( $height / 2 );
165 $centerx = round( $width / 2 );
166
167 // Cast those colors into an array.
168 $points = array(
169 imagecolorat( $img, $leftx, $topy ),
170 imagecolorat( $img, $rightx, $topy ),
171 imagecolorat( $img, $leftx, $bottomy ),
172 imagecolorat( $img, $rightx, $bottomy ),
173 imagecolorat( $img, $centerx, $centery ),
174 );
175
176 if ( 'hex' === $type ) {
177 foreach ( $points as $i => $p ) {
178 $c = imagecolorsforindex( $img, $p );
179 $points[ $i ] = self::get_color(
180 array(
181 'r' => $c['red'],
182 'g' => $c['green'],
183 'b' => $c['blue'],
184 ),
185 'hex'
186 );
187 }
188 }
189
190 return $points;
191 }
192
193 /**
194 * Finds the average color of the image based on five sample points
195 *
196 * @return array|bool array with rgb color or false if the image could not be loaded.
197 */
198 public function grab_color() {
199 $img = $this->image_obj;
200 if ( ! $img ) {
201 return false;
202 }
203
204 $rgb = self::grab_points();
205
206 $r = array();
207 $g = array();
208 $b = array();
209
210 /*
211 * Process the color points
212 * Find the average representation
213 */
214 foreach ( $rgb as $color ) {
215 $index = imagecolorsforindex( $img, $color );
216 $r[] = $index['red'];
217 $g[] = $index['green'];
218 $b[] = $index['blue'];
219 }
220 $red = round( array_sum( $r ) / 5 );
221 $green = round( array_sum( $g ) / 5 );
222 $blue = round( array_sum( $b ) / 5 );
223
224 // The average color of the image as rgb array.
225 $color = array(
226 'r' => $red,
227 'g' => $green,
228 'b' => $blue,
229 );
230
231 return $color;
232 }
233
234 /**
235 * Get a Color object using /lib class.color
236 * Convert to appropriate type
237 *
238 * @param string $color Color code.
239 * @param string $type Color type (rgb, hex, hsv).
240 *
241 * @return string
242 */
243 public function get_color( $color, $type ) {
244 $c = new Jetpack_Color( $color, 'rgb' );
245 $this->color = $c;
246
247 switch ( $type ) {
248 case 'rgb':
249 $color = implode( ',', $c->toRgbInt() );
250 break;
251 case 'hex':
252 $color = $c->toHex();
253 break;
254 case 'hsv':
255 $color = implode( ',', $c->toHsvInt() );
256 break;
257 default:
258 return $c->toHex();
259 }
260
261 return $color;
262 }
263
264 /**
265 *
266 * Checks contrast against main color
267 * Gives either black or white for using with opacity
268 *
269 * @return string|bool Returns black or white or false if the image could not be loaded.
270 */
271 public function contrast() {
272 if ( ! $this->color ) {
273 return false;
274 }
275
276 $c = $this->color->getMaxContrastColor();
277 return implode( ',', $c->toRgbInt() );
278 }
279 }
280 }
281