PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.4.4
Admin and Site Enhancements (ASE) v7.4.4
9.1.1 9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / classes / class-image-upload-control.php
admin-site-enhancements / classes Last commit date
class-activation.php 1 year ago class-admin-columns-manager.php 1 year ago class-admin-menu-organizer.php 1 year ago class-auto-publish-posts-with-missed-schedule.php 1 year ago class-avif-upload.php 1 year ago class-change-login-url.php 1 year ago class-cleanup-admin-bar.php 1 year ago class-code-snippets-manager.php 1 year ago class-common-methods.php 1 year ago class-content-duplication.php 1 year ago class-content-order.php 1 year ago class-custom-admin-footer-text.php 1 year ago class-custom-body-class.php 1 year ago class-custom-content-types.php 1 year ago class-custom-css.php 1 year ago class-custom-nav-menu-items-in-new-tab.php 1 year ago class-deactivation.php 1 year ago class-disable-comments.php 1 year ago class-disable-dashboard-widgets.php 1 year ago class-disable-feeds.php 1 year ago class-disable-gutenberg.php 1 year ago class-disable-rest-api.php 1 year ago class-disable-smaller-components.php 1 year ago class-disable-updates.php 1 year ago class-disable-xml-rpc.php 1 year ago class-display-system-summary.php 1 year ago class-email-address-obfuscator.php 1 year ago class-email-delivery.php 1 year ago class-enhance-list-tables.php 1 year ago class-external-permalinks.php 1 year ago class-heartbeat-control.php 1 year ago class-hide-admin-bar.php 1 year ago class-hide-admin-notices.php 1 year ago class-image-sizes-panel.php 1 year ago class-image-upload-control.php 1 year ago class-insert-head-body-footer-code.php 1 year ago class-last-login-column.php 1 year ago class-limit-login-attempts.php 1 year ago class-login-id-type.php 1 year ago class-login-logout-menu.php 1 year ago class-maintenance-mode.php 1 year ago class-manage-ads-appads-txt.php 1 year ago class-manage-robots-txt.php 1 year ago class-media-replacement.php 1 year ago class-multiple-user-roles.php 1 year ago class-obfuscate-author-slugs.php 1 year ago class-open-external-links-in-new-tab.php 1 year ago class-password-protection.php 1 year ago class-redirect-after-login.php 1 year ago class-redirect-after-logout.php 1 year ago class-redirect-fourofour.php 1 year ago class-revisions-control.php 1 year ago class-search-engines-visibility.php 1 year ago class-settings-fields-render.php 1 year ago class-settings-sanitization.php 1 year ago class-settings-sections-fields.php 1 year ago class-show-custom-taxonomy-filters.php 1 year ago class-site-identity-on-login-page.php 1 year ago class-svg-upload.php 1 year ago class-various-admin-ui-enhancements.php 1 year ago class-view-admin-as-role.php 1 year ago class-wider-admin-menu.php 1 year ago
class-image-upload-control.php
184 lines
1 <?php
2
3 namespace ASENHA\Classes;
4
5 use Imagick;
6 /**
7 * Class for Image Upload Control module
8 *
9 * @since 6.9.5
10 */
11 class Image_Upload_Control {
12 public $png_is_transparent;
13
14 /**
15 * Constructor
16 * @since 7.4.3
17 */
18 function __construct() {
19 $this->png_is_transparent = false;
20 }
21
22 /**
23 * Handler for image uploads. Convert and resize images.
24 *
25 * @since 4.3.0
26 */
27 public function image_upload_handler( $upload ) {
28 $applicable_mime_types = array(
29 'image/bmp',
30 'image/x-ms-bmp',
31 'image/png',
32 'image/jpeg',
33 'image/jpg',
34 'image/webp'
35 );
36 if ( in_array( $upload['type'], $applicable_mime_types ) ) {
37 // Exlude from conversion and resizing images with filenames ending with '-nr', e.g. birds-nr.png
38 if ( false !== strpos( $upload['file'], '-nr.' ) ) {
39 return $upload;
40 }
41 // Convert BMP
42 if ( 'image/bmp' === $upload['type'] || 'image/x-ms-bmp' === $upload['type'] ) {
43 $upload = $this->maybe_convert_image( 'bmp', $upload );
44 }
45 // Convert PNG without transparency
46 if ( 'image/png' === $upload['type'] ) {
47 $upload = $this->maybe_convert_image( 'png', $upload );
48 }
49 // At this point, BMPs and non-transparent PNGs are already converted to JPGs, unless excluded with '-nr' suffix.
50 // Let's perform resize operation as needed, i.e. if image dimension is larger than specified
51 $mime_types_to_resize = array(
52 'image/jpeg',
53 'image/jpg',
54 'image/png',
55 'image/webp'
56 );
57 if ( !is_wp_error( $upload ) && in_array( $upload['type'], $mime_types_to_resize ) && filesize( $upload['file'] ) > 0 ) {
58 // https://developer.wordpress.org/reference/classes/wp_image_editor/
59 $wp_image_editor = wp_get_image_editor( $upload['file'] );
60 if ( !is_wp_error( $wp_image_editor ) ) {
61 $image_size = $wp_image_editor->get_size();
62 $options = get_option( ASENHA_SLUG_U, array() );
63 $max_width = $options['image_max_width'];
64 $max_height = $options['image_max_height'];
65 // Check upload image's dimension and only resize if larger than the defined max dimension
66 if ( isset( $image_size['width'] ) && $image_size['width'] > $max_width || isset( $image_size['height'] ) && $image_size['height'] > $max_height ) {
67 $wp_image_editor->resize( $max_width, $max_height, false );
68 // false is for no cropping
69 if ( 'image/jpg' === $upload['type'] || 'image/jpeg' === $upload['type'] ) {
70 $wp_image_editor->set_quality( 90 );
71 // default is 82
72 }
73 $wp_image_editor->save( $upload['file'] );
74 }
75 }
76 }
77 }
78 return $upload;
79 }
80
81 /**
82 * Convert BMP or PNG without transparency into JPG
83 *
84 * @since 4.3.0
85 */
86 public function maybe_convert_image( $file_extension, $upload ) {
87 $image_object = null;
88 // Get image object from uploaded BMP/PNG
89 if ( 'bmp' === $file_extension ) {
90 if ( is_file( $upload['file'] ) ) {
91 // Generate image object from BMP for conversion to JPG later
92 if ( function_exists( 'imagecreatefrombmp' ) ) {
93 // PHP >= v7.2
94 $image_object = imagecreatefrombmp( $upload['file'] );
95 } else {
96 // PHP < v7.2
97 require_once ASENHA_PATH . 'includes/bmp-to-image-object.php';
98 $image_object = bmp_to_image_object( $upload['file'] );
99 }
100 }
101 }
102 if ( 'png' === $file_extension ) {
103 // Detect alpha/transparency in PNG
104 $this->png_is_transparent = false;
105 if ( is_file( $upload['file'] ) ) {
106 // We assume GD library is present, so 'imagecreatefrompng' function is available
107 // Generate image object from PNG for potential conversion to JPG later.
108 $image_object = imagecreatefrompng( $upload['file'] );
109 // Get image dimension
110 list( $width, $height ) = getimagesize( $upload['file'] );
111 // Run through pixels until transparent pixel is found
112 for ($x = 0; $x < $width; $x++) {
113 for ($y = 0; $y < $height; $y++) {
114 $pixel_color_index = imagecolorat( $image_object, $x, $y );
115 $pixel_rgba = imagecolorsforindex( $image_object, $pixel_color_index );
116 // array of red, green, blue and alpha values
117 if ( $pixel_rgba['alpha'] > 0 ) {
118 // a pixel with alpha/transparency has been found
119 // alpha value range from 0 (completely opaque) to 127 (fully transparent).
120 // Ref: https://www.php.net/manual/en/function.imagecolorallocatealpha.php
121 $this->png_is_transparent = true;
122 break 2;
123 // Break both 'for' loops
124 }
125 }
126 }
127 }
128 // Do not convert PNG with alpha/transparency
129 if ( $this->png_is_transparent ) {
130 return $upload;
131 }
132 }
133 // When conversion from BMP/PNG to JPG is successful. Last parameter is JPG quality (0-100).
134 if ( is_object( $image_object ) ) {
135 $wp_uploads = wp_upload_dir();
136 $old_filename = wp_basename( $upload['file'] );
137 // Assign new, unique file name for the converted image
138 // $new_filename = wp_basename( str_ireplace( '.' . $file_extension, '.jpg', $old_filename ) );
139 $new_filename = str_ireplace( '.' . $file_extension, '.jpg', $old_filename );
140 $new_filename = wp_unique_filename( dirname( $upload['file'] ), $new_filename );
141 if ( imagejpeg( $image_object, $wp_uploads['path'] . '/' . $new_filename, 90 ) ) {
142 // original image is always deleted in ASE Free
143 $keep_original_image = false;
144 if ( !$keep_original_image ) {
145 unlink( $upload['file'] );
146 }
147 // Add converted JPG info into $upload
148 $upload['file'] = $wp_uploads['path'] . '/' . $new_filename;
149 $upload['url'] = $wp_uploads['url'] . '/' . $new_filename;
150 $upload['type'] = 'image/jpeg';
151 }
152 }
153 return $upload;
154 }
155
156 /**
157 * Generate image object from PNG/JPG with GD library
158 *
159 * @since 6.9.11
160 */
161 public function gd_generate_webp(
162 $file,
163 $file_extension,
164 $webp_path,
165 $webp_conversion_quality
166 ) {
167 if ( 'png' == $file_extension ) {
168 $image_object = imagecreatefrompng( $file );
169 if ( $this->png_is_transparent ) {
170 imagepalettetotruecolor( $image_object );
171 }
172 }
173 if ( 'jpg' == $file_extension || 'jpeg' == $file_extension ) {
174 $image_object = imagecreatefromjpeg( $file );
175 }
176 // When creation of image object from PNG/JPG is successful. let's generate WebP image
177 // Second parameter is file path, last parameter is WebP quality (0-100).
178 if ( !is_null( $image_object ) && is_object( $image_object ) ) {
179 imagewebp( $image_object, $webp_path, $webp_conversion_quality );
180 }
181 }
182
183 }
184