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