PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.9.5
Jetpack – WP Security, Backup, Speed, & Growth v12.9.5
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 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 2 years ago class-jetpack-podcast-helper.php 2 years ago class-jetpack-recommendations.php 2 years ago class-jetpack-tweetstorm-helper.php 2 years ago class-jetpack-wizard.php 5 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 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 2 years ago class.media.php 2 years ago components.php 3 years ago debugger.php 4 years ago functions.wp-notify.php 3 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
279 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 ( str_starts_with( $_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 ( str_starts_with( $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 $response_code = wp_remote_retrieve_response_code( $response );
90 if (
91 is_wp_error( $response )
92 || ! $response_code
93 || $response_code < 200
94 || $response_code >= 300
95 ) {
96 return false;
97 }
98 $data = wp_remote_retrieve_body( $response );
99 }
100 }
101
102 // If it's a local path in our WordPress install.
103 if ( file_exists( $image_url ) ) {
104 $filetype = wp_check_filetype( $image_url );
105 $type = $filetype['type'];
106
107 if ( str_starts_with( $type, 'image/' ) ) {
108 $data = file_get_contents( $image_url ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
109 }
110 }
111
112 if ( null === $data ) {
113 return false;
114 }
115
116 // Now turn it into an image and return it.
117 return imagecreatefromstring( $data );
118 }
119
120 /**
121 * Construct object from image.
122 *
123 * @param string $type Type (hex, rgb, hsv) (optional).
124 *
125 * @return string|bool color as a string formatted as $type or false if the image could not be loaded.
126 */
127 public function color( $type = 'hex' ) {
128 // Bail if there is no image to work with.
129 if ( ! $this->image_obj ) {
130 return false;
131 }
132
133 // Finds dominant color.
134 $color = self::grab_color();
135 // Passes value to Color class.
136 return self::get_color( $color, $type );
137 }
138
139 /**
140 * Grabs the color index for each of five sample points of the image
141 *
142 * @param string $type can be 'index' or 'hex'.
143 *
144 * @return array|false color indices or false if the image could not be loaded.
145 */
146 public function grab_points( $type = 'index' ) {
147 $img = $this->image_obj;
148 if ( ! $img ) {
149 return false;
150 }
151
152 $height = imagesy( $img );
153 $width = imagesx( $img );
154
155 /*
156 * Sample five points in the image
157 * based on rule of thirds and center.
158 */
159 $topy = round( $height / 3 );
160 $bottomy = round( ( $height / 3 ) * 2 );
161 $leftx = round( $width / 3 );
162 $rightx = round( ( $width / 3 ) * 2 );
163 $centery = round( $height / 2 );
164 $centerx = round( $width / 2 );
165
166 // Cast those colors into an array.
167 $points = array(
168 imagecolorat( $img, $leftx, $topy ),
169 imagecolorat( $img, $rightx, $topy ),
170 imagecolorat( $img, $leftx, $bottomy ),
171 imagecolorat( $img, $rightx, $bottomy ),
172 imagecolorat( $img, $centerx, $centery ),
173 );
174
175 if ( 'hex' === $type ) {
176 foreach ( $points as $i => $p ) {
177 $c = imagecolorsforindex( $img, $p );
178 $points[ $i ] = self::get_color(
179 array(
180 'r' => $c['red'],
181 'g' => $c['green'],
182 'b' => $c['blue'],
183 ),
184 'hex'
185 );
186 }
187 }
188
189 return $points;
190 }
191
192 /**
193 * Finds the average color of the image based on five sample points
194 *
195 * @return array|bool array with rgb color or false if the image could not be loaded.
196 */
197 public function grab_color() {
198 $img = $this->image_obj;
199 if ( ! $img ) {
200 return false;
201 }
202
203 $rgb = self::grab_points();
204
205 $r = array();
206 $g = array();
207 $b = array();
208
209 /*
210 * Process the color points
211 * Find the average representation
212 */
213 foreach ( $rgb as $color ) {
214 $index = imagecolorsforindex( $img, $color );
215 $r[] = $index['red'];
216 $g[] = $index['green'];
217 $b[] = $index['blue'];
218 }
219 $red = round( array_sum( $r ) / 5 );
220 $green = round( array_sum( $g ) / 5 );
221 $blue = round( array_sum( $b ) / 5 );
222
223 // The average color of the image as rgb array.
224 $color = array(
225 'r' => $red,
226 'g' => $green,
227 'b' => $blue,
228 );
229
230 return $color;
231 }
232
233 /**
234 * Get a Color object using /lib class.color
235 * Convert to appropriate type
236 *
237 * @param string $color Color code.
238 * @param string $type Color type (rgb, hex, hsv).
239 *
240 * @return string
241 */
242 public function get_color( $color, $type ) {
243 $c = new Jetpack_Color( $color, 'rgb' );
244 $this->color = $c;
245
246 switch ( $type ) {
247 case 'rgb':
248 $color = implode( ',', $c->toRgbInt() );
249 break;
250 case 'hex':
251 $color = $c->toHex();
252 break;
253 case 'hsv':
254 $color = implode( ',', $c->toHsvInt() );
255 break;
256 default:
257 return $c->toHex();
258 }
259
260 return $color;
261 }
262
263 /**
264 *
265 * Checks contrast against main color
266 * Gives either black or white for using with opacity
267 *
268 * @return string|bool Returns black or white or false if the image could not be loaded.
269 */
270 public function contrast() {
271 if ( ! $this->color ) {
272 return false;
273 }
274
275 $c = $this->color->getMaxContrastColor();
276 return implode( ',', $c->toRgbInt() );
277 }
278 }
279