Linux premium71.web-hosting.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
LiteSpeed
Server IP : 198.187.29.8 & Your IP : 18.190.156.78
Domains :
Cant Read [ /etc/named.conf ]
User : cleahvkv
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
home /
cleahvkv /
ongd-tnp.org /
wp-includes /
Delete
Unzip
Name
Size
Permission
Date
Action
ID3
[ DIR ]
drwxr-xr-x
2025-05-06 11:54
IXR
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
Requests
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
SimplePie
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
Text
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
blocks
[ DIR ]
drwxr-xr-x
2025-04-11 09:42
certificates
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
css
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
customize
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
fonts
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
images
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
js
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
pomo
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
random_compat
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
rest-api
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
sodium_compat
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
theme-compat
[ DIR ]
drwxr-xr-x
2020-03-11 13:12
widgets
[ DIR ]
drwxr-xr-x
2022-11-29 02:16
.htaccess
197
B
-r--r--r--
2025-05-03 03:33
admin-bar.php
30.23
KB
-rw-r--r--
2020-03-11 13:12
atomlib.php
11.56
KB
-rw-r--r--
2020-03-11 13:12
author-template.php
16.6
KB
-rw-r--r--
2020-03-11 13:12
blocks.php
18.79
KB
-rw-r--r--
2023-05-17 05:55
bookmark-template.php
12.2
KB
-rw-r--r--
2020-03-11 13:12
bookmark.php
14.66
KB
-rw-r--r--
2022-08-30 21:02
cache.php
21.36
KB
-rw-r--r--
2020-04-30 04:13
canonical.php
28.23
KB
-rw-r--r--
2020-03-11 13:12
capabilities.php
33.29
KB
-rw-r--r--
2020-03-11 13:12
category-template.php
51.4
KB
-rw-r--r--
2020-03-11 13:12
category.php
12.09
KB
-rw-r--r--
2020-03-11 13:12
class-IXR.php
2.51
KB
-rw-r--r--
2020-03-11 13:12
class-feed.php
544
B
-rw-r--r--
2020-03-11 13:12
class-http.php
37.85
KB
-rw-r--r--
2020-03-11 13:12
class-json.php
42.37
KB
-rw-r--r--
2020-03-11 13:12
class-oembed.php
410
B
-rw-r--r--
2020-03-11 13:12
class-phpass.php
7.15
KB
-rw-r--r--
2020-03-11 13:12
class-phpmailer.php
145.11
KB
-rw-r--r--
2021-05-13 04:39
class-pop3.php
20.43
KB
-rw-r--r--
2020-03-11 13:12
class-requests.php
29.1
KB
-rw-r--r--
2020-03-11 13:12
class-simplepie.php
87.17
KB
-rw-r--r--
2020-03-11 13:12
class-smtp.php
39.96
KB
-rw-r--r--
2020-03-11 13:12
class-snoopy.php
36.9
KB
-rw-r--r--
2020-03-11 13:12
class-walker-category-dropdown.php
2.08
KB
-rw-r--r--
2020-03-11 13:12
class-walker-category.php
7.69
KB
-rw-r--r--
2020-03-11 13:12
class-walker-comment.php
13.36
KB
-rw-r--r--
2020-06-11 04:42
class-walker-nav-menu.php
8.47
KB
-rw-r--r--
2020-03-11 13:12
class-walker-page-dropdown.php
2.25
KB
-rw-r--r--
2020-03-11 13:12
class-walker-page.php
6.87
KB
-rw-r--r--
2020-03-11 13:12
class-wp-admin-bar.php
16.55
KB
-rw-r--r--
2020-03-11 13:12
class-wp-ajax-response.php
5.11
KB
-rw-r--r--
2020-03-11 13:12
class-wp-block-parser.php
14.86
KB
-rw-r--r--
2020-03-11 13:12
class-wp-block-styles-registry.php
4.55
KB
-rw-r--r--
2020-03-11 13:12
class-wp-block-type-registry.php
4.97
KB
-rw-r--r--
2023-10-13 06:06
class-wp-block-type.php
4.7
KB
-rw-r--r--
2020-03-11 13:12
class-wp-comment-query.php
43.47
KB
-rw-r--r--
2020-06-11 04:42
class-wp-comment.php
8.75
KB
-rw-r--r--
2020-03-11 13:12
class-wp-customize-control.php
24.47
KB
-rw-r--r--
2020-03-11 13:12
class-wp-customize-manager.php
198.49
KB
-rw-r--r--
2020-04-30 04:13
class-wp-customize-nav-menus.php
53.25
KB
-rw-r--r--
2020-03-11 13:12
class-wp-customize-panel.php
9.37
KB
-rw-r--r--
2020-03-11 13:12
class-wp-customize-section.php
9.93
KB
-rw-r--r--
2020-03-11 13:12
class-wp-customize-setting.php
27.53
KB
-rw-r--r--
2020-03-11 13:12
class-wp-customize-widgets.php
65.41
KB
-rw-r--r--
2020-03-11 13:12
class-wp-date-query.php
34.45
KB
-rw-r--r--
2022-10-18 04:36
class-wp-dependency.php
2.44
KB
-rw-r--r--
2020-03-11 13:12
class-wp-editor.php
66.62
KB
-rw-r--r--
2020-03-11 13:12
class-wp-embed.php
14.4
KB
-rw-r--r--
2020-03-11 13:12
class-wp-error.php
4.81
KB
-rw-r--r--
2020-03-11 13:12
class-wp-fatal-error-handler.php
7.25
KB
-rw-r--r--
2020-03-11 13:12
class-wp-feed-cache-transient.php
2.5
KB
-rw-r--r--
2020-03-11 13:12
class-wp-feed-cache.php
749
B
-rw-r--r--
2020-03-11 13:12
class-wp-hook.php
13.96
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-cookie.php
6.98
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-curl.php
12.04
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-encoding.php
6.39
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-ixr-client.php
3.25
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-proxy.php
5.93
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-requests-hooks.php
1.9
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-requests-response.php
4.24
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-response.php
2.88
KB
-rw-r--r--
2020-03-11 13:12
class-wp-http-streams.php
15.69
KB
-rw-r--r--
2020-03-11 13:12
class-wp-image-editor-gd.php
13.56
KB
-rw-r--r--
2020-03-11 13:12
class-wp-image-editor-imagick.php
23.09
KB
-rw-r--r--
2020-03-11 13:12
class-wp-image-editor.php
13.58
KB
-rw-r--r--
2020-03-11 13:12
class-wp-list-util.php
6.26
KB
-rw-r--r--
2020-03-11 13:12
class-wp-locale-switcher.php
4.9
KB
-rw-r--r--
2020-03-11 13:12
class-wp-locale.php
13.57
KB
-rw-r--r--
2020-03-11 13:12
class-wp-matchesmapregex.php
1.76
KB
-rw-r--r--
2020-03-11 13:12
class-wp-meta-query.php
27.19
KB
-rw-r--r--
2022-01-06 21:24
class-wp-metadata-lazyloader.php
5.26
KB
-rw-r--r--
2020-03-11 13:12
class-wp-network-query.php
17.94
KB
-rw-r--r--
2020-03-11 13:12
class-wp-network.php
12
KB
-rw-r--r--
2020-03-11 13:12
class-wp-oembed-controller.php
5.89
KB
-rw-r--r--
2020-03-11 13:12
class-wp-oembed.php
29.47
KB
-rw-r--r--
2020-03-11 13:12
class-wp-paused-extensions-storage.php
4.82
KB
-rw-r--r--
2020-03-11 13:12
class-wp-post-type.php
19.07
KB
-rw-r--r--
2020-03-11 13:12
class-wp-post.php
6.29
KB
-rw-r--r--
2020-03-11 13:12
class-wp-query.php
128.01
KB
-rw-r--r--
2022-10-18 04:36
class-wp-recovery-mode-cookie-service.php
6.31
KB
-rw-r--r--
2020-03-11 13:12
class-wp-recovery-mode-email-service.php
9.88
KB
-rw-r--r--
2020-03-11 13:12
class-wp-recovery-mode-key-service.php
4.18
KB
-rw-r--r--
2020-03-11 13:12
class-wp-recovery-mode-link-service.php
3.29
KB
-rw-r--r--
2020-03-11 13:12
class-wp-recovery-mode.php
11.09
KB
-rw-r--r--
2020-03-11 13:12
class-wp-rewrite.php
58.49
KB
-rw-r--r--
2020-03-11 13:12
class-wp-role.php
2.6
KB
-rw-r--r--
2020-03-11 13:12
class-wp-roles.php
8.11
KB
-rw-r--r--
2020-03-11 13:12
class-wp-session-tokens.php
7.26
KB
-rw-r--r--
2020-03-11 13:12
class-wp-simplepie-file.php
2.27
KB
-rw-r--r--
2020-03-11 13:12
class-wp-simplepie-sanitize-kses.php
1.73
KB
-rw-r--r--
2020-03-11 13:12
class-wp-site-query.php
27.86
KB
-rw-r--r--
2020-03-11 13:12
class-wp-site.php
7.19
KB
-rw-r--r--
2020-03-11 13:12
class-wp-tax-query.php
18.98
KB
-rw-r--r--
2022-01-06 21:24
class-wp-taxonomy.php
10.44
KB
-rw-r--r--
2020-03-11 13:12
class-wp-term-query.php
34.59
KB
-rw-r--r--
2020-03-11 13:12
class-wp-term.php
5.14
KB
-rw-r--r--
2020-03-11 13:12
class-wp-text-diff-renderer-inline.php
716
B
-rw-r--r--
2020-03-11 13:12
class-wp-text-diff-renderer-table.php
16.4
KB
-rw-r--r--
2020-03-11 13:12
class-wp-theme.php
49.78
KB
-rw-r--r--
2023-10-13 06:06
class-wp-user-meta-session-tokens.php
2.92
KB
-rw-r--r--
2020-03-11 13:12
class-wp-user-query.php
30.56
KB
-rw-r--r--
2020-03-11 13:12
class-wp-user-request.php
1.95
KB
-rw-r--r--
2020-03-11 13:12
class-wp-user.php
21.26
KB
-rw-r--r--
2020-03-11 13:12
class-wp-walker.php
12.42
KB
-rw-r--r--
2020-03-11 13:12
class-wp-widget-factory.php
2.79
KB
-rw-r--r--
2020-03-11 13:12
class-wp-widget.php
17.42
KB
-rw-r--r--
2020-03-11 13:12
class-wp-xmlrpc-server.php
205.15
KB
-rw-r--r--
2020-10-29 20:46
class-wp.php
23.98
KB
-rw-r--r--
2020-06-11 04:42
class.wp-dependencies.php
11.25
KB
-rw-r--r--
2020-03-11 13:12
class.wp-scripts.php
17.34
KB
-rw-r--r--
2020-03-11 13:12
class.wp-styles.php
10.29
KB
-rw-r--r--
2020-03-11 13:12
comment-template.php
89.49
KB
-rw-r--r--
2020-06-11 04:42
comment.php
114.49
KB
-rw-r--r--
2022-10-18 04:36
compat.php
12.68
KB
-rw-r--r--
2024-01-31 16:31
cron.php
31.69
KB
-rw-r--r--
2020-03-11 13:12
date.php
409
B
-rw-r--r--
2020-03-11 13:12
default-constants.php
9.88
KB
-rw-r--r--
2020-03-11 13:12
default-filters.php
25.29
KB
-rw-r--r--
2020-06-11 04:42
default-widgets.php
2.13
KB
-rw-r--r--
2020-03-11 13:12
deprecated.php
111.96
KB
-rw-r--r--
2022-10-18 04:36
embed-template.php
344
B
-rw-r--r--
2020-03-11 13:12
embed.php
46.26
KB
-rw-r--r--
2023-05-17 05:55
error-protection.php
3.31
KB
-rw-r--r--
2020-03-11 13:12
error_log
22.77
KB
-rw-r--r--
2025-05-06 19:35
feed-atom-comments.php
5.28
KB
-rw-r--r--
2020-03-11 13:12
feed-atom.php
3.01
KB
-rw-r--r--
2020-03-11 13:12
feed-rdf.php
2.6
KB
-rw-r--r--
2020-03-11 13:12
feed-rss.php
1.16
KB
-rw-r--r--
2020-03-11 13:12
feed-rss2-comments.php
4.05
KB
-rw-r--r--
2020-03-11 13:12
feed-rss2.php
3.69
KB
-rw-r--r--
2020-03-11 13:12
feed.php
21.51
KB
-rw-r--r--
2020-03-11 13:12
formatting.php
291.43
KB
-rw-r--r--
2023-05-17 05:55
functions.php
222.81
KB
-rw-r--r--
2024-06-25 05:05
functions.wp-scripts.php
12.52
KB
-rw-r--r--
2020-03-11 13:12
functions.wp-styles.php
8.03
KB
-rw-r--r--
2020-03-11 13:12
general-template.php
148.89
KB
-rw-r--r--
2020-03-11 13:12
http.php
22.02
KB
-rw-r--r--
2020-03-11 13:12
kses.php
57.39
KB
-rw-r--r--
2020-03-11 13:12
l10n.php
51.86
KB
-rw-r--r--
2023-05-17 05:55
link-template.php
140.16
KB
-rw-r--r--
2020-03-11 13:12
load.php
42.28
KB
-rw-r--r--
2020-03-11 13:12
locale.php
162
B
-rw-r--r--
2020-03-11 13:12
media-template.php
56.36
KB
-rw-r--r--
2022-10-18 04:36
media.php
146.21
KB
-rw-r--r--
2023-10-13 06:06
meta.php
46.63
KB
-rw-r--r--
2020-10-29 20:46
ms-blogs.php
23.84
KB
-rw-r--r--
2020-03-11 13:12
ms-default-constants.php
4.67
KB
-rw-r--r--
2020-03-11 13:12
ms-default-filters.php
6.26
KB
-rw-r--r--
2020-03-11 13:12
ms-deprecated.php
20.84
KB
-rw-r--r--
2020-03-11 13:12
ms-files.php
2.59
KB
-rw-r--r--
2020-03-11 13:12
ms-functions.php
85.58
KB
-rw-r--r--
2020-03-11 13:12
ms-load.php
19.16
KB
-rw-r--r--
2020-03-11 13:12
ms-network.php
3.57
KB
-rw-r--r--
2020-03-11 13:12
ms-settings.php
4.04
KB
-rw-r--r--
2020-03-11 13:12
ms-site.php
42.06
KB
-rw-r--r--
2020-03-11 13:12
nav-menu-template.php
21.54
KB
-rw-r--r--
2020-03-11 13:12
nav-menu.php
40.33
KB
-rw-r--r--
2020-03-11 13:12
option.php
68.5
KB
-rw-r--r--
2020-03-11 13:12
pluggable-deprecated.php
6.12
KB
-rw-r--r--
2020-03-11 13:12
pluggable.php
97.49
KB
-rw-r--r--
2022-10-18 04:36
plugin.php
31.59
KB
-rw-r--r--
2020-03-11 13:13
post-formats.php
6.89
KB
-rw-r--r--
2020-03-11 13:12
post-template-ajax.php
361
B
-rw-r--r--
2020-03-11 13:12
post-template.php
61.44
KB
-rw-r--r--
2022-08-30 21:02
post-thumbnail-template-edit.php
1.05
KB
-rw-r--r--
2020-03-11 13:12
post-thumbnail-template.php
8.78
KB
-rw-r--r--
2020-03-11 13:12
post.php
238.88
KB
-rw-r--r--
2022-10-18 04:36
query.php
32.16
KB
-rw-r--r--
2020-03-11 13:12
registration-functions.php
202
B
-rw-r--r--
2020-03-11 13:12
registration.php
202
B
-rw-r--r--
2020-03-11 13:12
rest-api.php
45.54
KB
-rw-r--r--
2023-10-13 06:06
revision.php
21.18
KB
-rw-r--r--
2020-03-11 13:12
rewrite.php
17.61
KB
-rw-r--r--
2020-03-11 13:12
rss-functions.php
214
B
-rw-r--r--
2020-03-11 13:12
rss.php
22.66
KB
-rw-r--r--
2020-03-11 13:12
script-loader.php
110.89
KB
-rw-r--r--
2022-03-11 05:57
session.php
264
B
-rw-r--r--
2020-03-11 13:12
shortcodes.php
21.2
KB
-rw-r--r--
2023-10-13 06:06
spl-autoload-compat.php
443
B
-rw-r--r--
2020-03-11 13:12
taxonomy.php
154.26
KB
-rw-r--r--
2020-03-11 13:12
template-loader.php
2.79
KB
-rw-r--r--
2020-03-11 13:12
template.php
20.55
KB
-rw-r--r--
2020-03-11 13:12
theme.php
102.42
KB
-rw-r--r--
2020-03-11 13:12
update.php
24.97
KB
-rw-r--r--
2020-03-11 13:12
user.php
121
KB
-rw-r--r--
2020-04-30 04:13
vars.php
5.68
KB
-rw-r--r--
2020-03-11 13:12
version.php
762
B
-rw-r--r--
2024-06-25 05:05
widgets.php
57.37
KB
-rw-r--r--
2022-10-18 04:36
wlwmanifest.xml
1.02
KB
-rw-r--r--
2020-03-11 13:12
wp-blog-header.php
2.73
KB
-r--r--r--
2025-05-03 03:33
wp-cron.php
2.73
KB
-rw-r--r--
2025-05-03 03:33
wp-db.php
101.4
KB
-rw-r--r--
2020-03-11 13:12
wp-diff.php
662
B
-rw-r--r--
2020-03-11 13:12
Save
Rename
<?php /** * WordPress Imagick Image Editor * * @package WordPress * @subpackage Image_Editor */ /** * WordPress Image Editor Class for Image Manipulation through Imagick PHP Module * * @since 3.5.0 * * @see WP_Image_Editor */ class WP_Image_Editor_Imagick extends WP_Image_Editor { /** * Imagick object. * * @var Imagick */ protected $image; public function __destruct() { if ( $this->image instanceof Imagick ) { // we don't need the original in memory anymore $this->image->clear(); $this->image->destroy(); } } /** * Checks to see if current environment supports Imagick. * * We require Imagick 2.2.0 or greater, based on whether the queryFormats() * method can be called statically. * * @since 3.5.0 * * @param array $args * @return bool */ public static function test( $args = array() ) { // First, test Imagick's extension and classes. if ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick', false ) || ! class_exists( 'ImagickPixel', false ) ) { return false; } if ( version_compare( phpversion( 'imagick' ), '2.2.0', '<' ) ) { return false; } $required_methods = array( 'clear', 'destroy', 'valid', 'getimage', 'writeimage', 'getimageblob', 'getimagegeometry', 'getimageformat', 'setimageformat', 'setimagecompression', 'setimagecompressionquality', 'setimagepage', 'setoption', 'scaleimage', 'cropimage', 'rotateimage', 'flipimage', 'flopimage', 'readimage', ); // Now, test for deep requirements within Imagick. if ( ! defined( 'imagick::COMPRESSION_JPEG' ) ) { return false; } $class_methods = array_map( 'strtolower', get_class_methods( 'Imagick' ) ); if ( array_diff( $required_methods, $class_methods ) ) { return false; } return true; } /** * Checks to see if editor supports the mime-type specified. * * @since 3.5.0 * * @param string $mime_type * @return bool */ public static function supports_mime_type( $mime_type ) { $imagick_extension = strtoupper( self::get_extension( $mime_type ) ); if ( ! $imagick_extension ) { return false; } // setIteratorIndex is optional unless mime is an animated format. // Here, we just say no if you are missing it and aren't loading a jpeg. if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && $mime_type !== 'image/jpeg' ) { return false; } try { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged return ( (bool) @Imagick::queryFormats( $imagick_extension ) ); } catch ( Exception $e ) { return false; } } /** * Loads image from $this->file into new Imagick Object. * * @since 3.5.0 * * @return true|WP_Error True if loaded; WP_Error on failure. */ public function load() { if ( $this->image instanceof Imagick ) { return true; } if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) { return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file ); } /* * Even though Imagick uses less PHP memory than GD, set higher limit * for users that have low PHP.ini limits. */ wp_raise_memory_limit( 'image' ); try { $this->image = new Imagick(); $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); $filename = $this->file; if ( 'pdf' === $file_extension ) { $filename = $this->pdf_setup(); } // Reading image after Imagick instantiation because `setResolution` // only applies correctly before the image is read. $this->image->readImage( $filename ); if ( ! $this->image->valid() ) { return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file ); } // Select the first frame to handle animated images properly if ( is_callable( array( $this->image, 'setIteratorIndex' ) ) ) { $this->image->setIteratorIndex( 0 ); } $this->mime_type = $this->get_mime_type( $this->image->getImageFormat() ); } catch ( Exception $e ) { return new WP_Error( 'invalid_image', $e->getMessage(), $this->file ); } $updated_size = $this->update_size(); if ( is_wp_error( $updated_size ) ) { return $updated_size; } return $this->set_quality(); } /** * Sets Image Compression quality on a 1-100% scale. * * @since 3.5.0 * * @param int $quality Compression Quality. Range: [1,100] * @return true|WP_Error True if set successfully; WP_Error on failure. */ public function set_quality( $quality = null ) { $quality_result = parent::set_quality( $quality ); if ( is_wp_error( $quality_result ) ) { return $quality_result; } else { $quality = $this->get_quality(); } try { if ( 'image/jpeg' === $this->mime_type ) { $this->image->setImageCompressionQuality( $quality ); $this->image->setImageCompression( imagick::COMPRESSION_JPEG ); } else { $this->image->setImageCompressionQuality( $quality ); } } catch ( Exception $e ) { return new WP_Error( 'image_quality_error', $e->getMessage() ); } return true; } /** * Sets or updates current image size. * * @since 3.5.0 * * @param int $width * @param int $height * * @return true|WP_Error */ protected function update_size( $width = null, $height = null ) { $size = null; if ( ! $width || ! $height ) { try { $size = $this->image->getImageGeometry(); } catch ( Exception $e ) { return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file ); } } if ( ! $width ) { $width = $size['width']; } if ( ! $height ) { $height = $size['height']; } return parent::update_size( $width, $height ); } /** * Resizes current image. * * At minimum, either a height or width must be provided. * If one of the two is set to null, the resize will * maintain aspect ratio according to the provided dimension. * * @since 3.5.0 * * @param int|null $max_w Image width. * @param int|null $max_h Image height. * @param bool $crop * @return bool|WP_Error */ public function resize( $max_w, $max_h, $crop = false ) { if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) { return true; } $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); if ( ! $dims ) { return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ) ); } list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; if ( $crop ) { return $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h ); } // Execute the resize $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); if ( is_wp_error( $thumb_result ) ) { return $thumb_result; } return $this->update_size( $dst_w, $dst_h ); } /** * Efficiently resize the current image * * This is a WordPress specific implementation of Imagick::thumbnailImage(), * which resizes an image to given dimensions and removes any associated profiles. * * @since 4.5.0 * * @param int $dst_w The destination width. * @param int $dst_h The destination height. * @param string $filter_name Optional. The Imagick filter to use when resizing. Default 'FILTER_TRIANGLE'. * @param bool $strip_meta Optional. Strip all profiles, excluding color profiles, from the image. Default true. * @return bool|WP_Error */ protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIANGLE', $strip_meta = true ) { $allowed_filters = array( 'FILTER_POINT', 'FILTER_BOX', 'FILTER_TRIANGLE', 'FILTER_HERMITE', 'FILTER_HANNING', 'FILTER_HAMMING', 'FILTER_BLACKMAN', 'FILTER_GAUSSIAN', 'FILTER_QUADRATIC', 'FILTER_CUBIC', 'FILTER_CATROM', 'FILTER_MITCHELL', 'FILTER_LANCZOS', 'FILTER_BESSEL', 'FILTER_SINC', ); /** * Set the filter value if '$filter_name' name is in our whitelist and the related * Imagick constant is defined or fall back to our default filter. */ if ( in_array( $filter_name, $allowed_filters, true ) && defined( 'Imagick::' . $filter_name ) ) { $filter = constant( 'Imagick::' . $filter_name ); } else { $filter = defined( 'Imagick::FILTER_TRIANGLE' ) ? Imagick::FILTER_TRIANGLE : false; } /** * Filters whether to strip metadata from images when they're resized. * * This filter only applies when resizing using the Imagick editor since GD * always strips profiles by default. * * @since 4.5.0 * * @param bool $strip_meta Whether to strip image metadata during resizing. Default true. */ if ( apply_filters( 'image_strip_meta', $strip_meta ) ) { $this->strip_meta(); // Fail silently if not supported. } try { /* * To be more efficient, resample large images to 5x the destination size before resizing * whenever the output size is less that 1/3 of the original image size (1/3^2 ~= .111), * unless we would be resampling to a scale smaller than 128x128. */ if ( is_callable( array( $this->image, 'sampleImage' ) ) ) { $resize_ratio = ( $dst_w / $this->size['width'] ) * ( $dst_h / $this->size['height'] ); $sample_factor = 5; if ( $resize_ratio < .111 && ( $dst_w * $sample_factor > 128 && $dst_h * $sample_factor > 128 ) ) { $this->image->sampleImage( $dst_w * $sample_factor, $dst_h * $sample_factor ); } } /* * Use resizeImage() when it's available and a valid filter value is set. * Otherwise, fall back to the scaleImage() method for resizing, which * results in better image quality over resizeImage() with default filter * settings and retains backward compatibility with pre 4.5 functionality. */ if ( is_callable( array( $this->image, 'resizeImage' ) ) && $filter ) { $this->image->setOption( 'filter:support', '2.0' ); $this->image->resizeImage( $dst_w, $dst_h, $filter, 1 ); } else { $this->image->scaleImage( $dst_w, $dst_h ); } // Set appropriate quality settings after resizing. if ( 'image/jpeg' === $this->mime_type ) { if ( is_callable( array( $this->image, 'unsharpMaskImage' ) ) ) { $this->image->unsharpMaskImage( 0.25, 0.25, 8, 0.065 ); } $this->image->setOption( 'jpeg:fancy-upsampling', 'off' ); } if ( 'image/png' === $this->mime_type ) { $this->image->setOption( 'png:compression-filter', '5' ); $this->image->setOption( 'png:compression-level', '9' ); $this->image->setOption( 'png:compression-strategy', '1' ); $this->image->setOption( 'png:exclude-chunk', 'all' ); } /* * If alpha channel is not defined, set it opaque. * * Note that Imagick::getImageAlphaChannel() is only available if Imagick * has been compiled against ImageMagick version 6.4.0 or newer. */ if ( is_callable( array( $this->image, 'getImageAlphaChannel' ) ) && is_callable( array( $this->image, 'setImageAlphaChannel' ) ) && defined( 'Imagick::ALPHACHANNEL_UNDEFINED' ) && defined( 'Imagick::ALPHACHANNEL_OPAQUE' ) ) { if ( $this->image->getImageAlphaChannel() === Imagick::ALPHACHANNEL_UNDEFINED ) { $this->image->setImageAlphaChannel( Imagick::ALPHACHANNEL_OPAQUE ); } } // Limit the bit depth of resized images to 8 bits per channel. if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) { if ( 8 < $this->image->getImageDepth() ) { $this->image->setImageDepth( 8 ); } } if ( is_callable( array( $this->image, 'setInterlaceScheme' ) ) && defined( 'Imagick::INTERLACE_NO' ) ) { $this->image->setInterlaceScheme( Imagick::INTERLACE_NO ); } } catch ( Exception $e ) { return new WP_Error( 'image_resize_error', $e->getMessage() ); } } /** * Create multiple smaller images from a single source. * * Attempts to create all sub-sizes and returns the meta data at the end. This * may result in the server running out of resources. When it fails there may be few * "orphaned" images left over as the meta data is never returned and saved. * * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates * the new images one at a time and allows for the meta data to be saved after * each new image is created. * * @since 3.5.0 * * @param array $sizes { * An array of image size data arrays. * * Either a height or width must be provided. * If one of the two is set to null, the resize will * maintain aspect ratio according to the provided dimension. * * @type array $size { * Array of height, width values, and whether to crop. * * @type int $width Image width. Optional if `$height` is specified. * @type int $height Image height. Optional if `$width` is specified. * @type bool $crop Optional. Whether to crop the image. Default false. * } * } * @return array An array of resized images' metadata by size. */ public function multi_resize( $sizes ) { $metadata = array(); foreach ( $sizes as $size => $size_data ) { $meta = $this->make_subsize( $size_data ); if ( ! is_wp_error( $meta ) ) { $metadata[ $size ] = $meta; } } return $metadata; } /** * Create an image sub-size and return the image meta data value for it. * * @since 5.3.0 * * @param array $size_data Array of width, height, and whether to crop. * @return WP_Error|array WP_Error on error, or the image data array for inclusion in the `sizes` array in the image meta. */ public function make_subsize( $size_data ) { if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) ); } $orig_size = $this->size; $orig_image = $this->image->getImage(); if ( ! isset( $size_data['width'] ) ) { $size_data['width'] = null; } if ( ! isset( $size_data['height'] ) ) { $size_data['height'] = null; } if ( ! isset( $size_data['crop'] ) ) { $size_data['crop'] = false; } $resized = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); if ( is_wp_error( $resized ) ) { $saved = $resized; } else { $saved = $this->_save( $this->image ); $this->image->clear(); $this->image->destroy(); $this->image = null; } $this->size = $orig_size; $this->image = $orig_image; if ( ! is_wp_error( $saved ) ) { unset( $saved['path'] ); } return $saved; } /** * Crops Image. * * @since 3.5.0 * * @param int $src_x The start x position to crop from. * @param int $src_y The start y position to crop from. * @param int $src_w The width to crop. * @param int $src_h The height to crop. * @param int $dst_w Optional. The destination width. * @param int $dst_h Optional. The destination height. * @param bool $src_abs Optional. If the source crop points are absolute. * @return bool|WP_Error */ public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { if ( $src_abs ) { $src_w -= $src_x; $src_h -= $src_y; } try { $this->image->cropImage( $src_w, $src_h, $src_x, $src_y ); $this->image->setImagePage( $src_w, $src_h, 0, 0 ); if ( $dst_w || $dst_h ) { // If destination width/height isn't specified, use same as // width/height from source. if ( ! $dst_w ) { $dst_w = $src_w; } if ( ! $dst_h ) { $dst_h = $src_h; } $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); if ( is_wp_error( $thumb_result ) ) { return $thumb_result; } return $this->update_size(); } } catch ( Exception $e ) { return new WP_Error( 'image_crop_error', $e->getMessage() ); } return $this->update_size(); } /** * Rotates current image counter-clockwise by $angle. * * @since 3.5.0 * * @param float $angle * @return true|WP_Error */ public function rotate( $angle ) { /** * $angle is 360-$angle because Imagick rotates clockwise * (GD rotates counter-clockwise) */ try { $this->image->rotateImage( new ImagickPixel( 'none' ), 360 - $angle ); // Normalise EXIF orientation data so that display is consistent across devices. if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); } // Since this changes the dimensions of the image, update the size. $result = $this->update_size(); if ( is_wp_error( $result ) ) { return $result; } $this->image->setImagePage( $this->size['width'], $this->size['height'], 0, 0 ); } catch ( Exception $e ) { return new WP_Error( 'image_rotate_error', $e->getMessage() ); } return true; } /** * Flips current image. * * @since 3.5.0 * * @param bool $horz Flip along Horizontal Axis * @param bool $vert Flip along Vertical Axis * @return true|WP_Error */ public function flip( $horz, $vert ) { try { if ( $horz ) { $this->image->flipImage(); } if ( $vert ) { $this->image->flopImage(); } // Normalise EXIF orientation data so that display is consistent across devices. if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); } } catch ( Exception $e ) { return new WP_Error( 'image_flip_error', $e->getMessage() ); } return true; } /** * Check if a JPEG image has EXIF Orientation tag and rotate it if needed. * * As ImageMagick copies the EXIF data to the flipped/rotated image, proceed only * if EXIF Orientation can be reset afterwards. * * @since 5.3.0 * * @return bool|WP_Error True if the image was rotated. False if no EXIF data or if the image doesn't need rotation. * WP_Error if error while rotating. */ public function maybe_exif_rotate() { if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { return parent::maybe_exif_rotate(); } else { return new WP_Error( 'write_exif_error', __( 'The image cannot be rotated because the embedded meta data cannot be updated.' ) ); } } /** * Saves current image to file. * * @since 3.5.0 * * @param string $destfilename * @param string $mime_type * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} */ public function save( $destfilename = null, $mime_type = null ) { $saved = $this->_save( $this->image, $destfilename, $mime_type ); if ( ! is_wp_error( $saved ) ) { $this->file = $saved['path']; $this->mime_type = $saved['mime-type']; try { $this->image->setImageFormat( strtoupper( $this->get_extension( $this->mime_type ) ) ); } catch ( Exception $e ) { return new WP_Error( 'image_save_error', $e->getMessage(), $this->file ); } } return $saved; } /** * @param Imagick $image * @param string $filename * @param string $mime_type * @return array|WP_Error */ protected function _save( $image, $filename = null, $mime_type = null ) { list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); if ( ! $filename ) { $filename = $this->generate_filename( null, null, $extension ); } try { // Store initial Format $orig_format = $this->image->getImageFormat(); $this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) ); $this->make_image( $filename, array( $image, 'writeImage' ), array( $filename ) ); // Reset original Format $this->image->setImageFormat( $orig_format ); } catch ( Exception $e ) { return new WP_Error( 'image_save_error', $e->getMessage(), $filename ); } // Set correct file permissions $stat = stat( dirname( $filename ) ); $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits chmod( $filename, $perms ); return array( 'path' => $filename, /** This filter is documented in wp-includes/class-wp-image-editor-gd.php */ 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), 'width' => $this->size['width'], 'height' => $this->size['height'], 'mime-type' => $mime_type, ); } /** * Streams current image to browser. * * @since 3.5.0 * * @param string $mime_type The mime type of the image. * @return bool|WP_Error True on success, WP_Error object on failure. */ public function stream( $mime_type = null ) { list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); try { // Temporarily change format for stream $this->image->setImageFormat( strtoupper( $extension ) ); // Output stream of image content header( "Content-Type: $mime_type" ); print $this->image->getImageBlob(); // Reset Image to original Format $this->image->setImageFormat( $this->get_extension( $this->mime_type ) ); } catch ( Exception $e ) { return new WP_Error( 'image_stream_error', $e->getMessage() ); } return true; } /** * Strips all image meta except color profiles from an image. * * @since 4.5.0 * * @return true|WP_Error True if stripping metadata was successful. WP_Error object on error. */ protected function strip_meta() { if ( ! is_callable( array( $this->image, 'getImageProfiles' ) ) ) { /* translators: %s: ImageMagick method name. */ return new WP_Error( 'image_strip_meta_error', sprintf( __( '%s is required to strip image meta.' ), '<code>Imagick::getImageProfiles()</code>' ) ); } if ( ! is_callable( array( $this->image, 'removeImageProfile' ) ) ) { /* translators: %s: ImageMagick method name. */ return new WP_Error( 'image_strip_meta_error', sprintf( __( '%s is required to strip image meta.' ), '<code>Imagick::removeImageProfile()</code>' ) ); } /* * Protect a few profiles from being stripped for the following reasons: * * - icc: Color profile information * - icm: Color profile information * - iptc: Copyright data * - exif: Orientation data * - xmp: Rights usage data */ $protected_profiles = array( 'icc', 'icm', 'iptc', 'exif', 'xmp', ); try { // Strip profiles. foreach ( $this->image->getImageProfiles( '*', true ) as $key => $value ) { if ( ! in_array( $key, $protected_profiles, true ) ) { $this->image->removeImageProfile( $key ); } } } catch ( Exception $e ) { return new WP_Error( 'image_strip_meta_error', $e->getMessage() ); } return true; } /** * Sets up Imagick for PDF processing. * Increases rendering DPI and only loads first page. * * @since 4.7.0 * * @return string|WP_Error File to load or WP_Error on failure. */ protected function pdf_setup() { try { // By default, PDFs are rendered in a very low resolution. // We want the thumbnail to be readable, so increase the rendering DPI. $this->image->setResolution( 128, 128 ); // When generating thumbnails from cropped PDF pages, Imagemagick uses the uncropped // area (resulting in unnecessary whitespace) unless the following option is set. $this->image->setOption( 'pdf:use-cropbox', true ); // Only load the first page. return $this->file . '[0]'; } catch ( Exception $e ) { return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file ); } } }