PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.3.2
Admin and Site Enhancements (ASE) v7.3.2
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 2 years ago class-admin-columns-manager.php 2 years ago class-admin-menu-organizer.php 2 years ago class-auto-publish-posts-with-missed-schedule.php 2 years ago class-avif-upload.php 2 years ago class-change-login-url.php 2 years ago class-cleanup-admin-bar.php 2 years ago class-code-snippets-manager.php 2 years ago class-common-methods.php 2 years ago class-content-duplication.php 2 years ago class-content-order.php 2 years ago class-custom-admin-footer-text.php 2 years ago class-custom-body-class.php 2 years ago class-custom-content-types.php 2 years ago class-custom-css.php 2 years ago class-custom-nav-menu-items-in-new-tab.php 2 years ago class-deactivation.php 2 years ago class-disable-comments.php 2 years ago class-disable-dashboard-widgets.php 2 years ago class-disable-feeds.php 2 years ago class-disable-gutenberg.php 2 years ago class-disable-rest-api.php 2 years ago class-disable-smaller-components.php 2 years ago class-disable-updates.php 2 years ago class-disable-xml-rpc.php 2 years ago class-display-system-summary.php 2 years ago class-email-address-obfuscator.php 2 years ago class-email-delivery.php 2 years ago class-enhance-list-tables.php 2 years ago class-external-permalinks.php 2 years ago class-heartbeat-control.php 2 years ago class-hide-admin-bar.php 2 years ago class-hide-admin-notices.php 2 years ago class-image-sizes-panel.php 2 years ago class-image-upload-control.php 2 years ago class-insert-head-body-footer-code.php 2 years ago class-last-login-column.php 2 years ago class-limit-login-attempts.php 2 years ago class-login-id-type.php 2 years ago class-login-logout-menu.php 2 years ago class-maintenance-mode.php 2 years ago class-manage-ads-appads-txt.php 2 years ago class-manage-robots-txt.php 2 years ago class-media-replacement.php 2 years ago class-multiple-user-roles.php 2 years ago class-obfuscate-author-slugs.php 2 years ago class-open-external-links-in-new-tab.php 2 years ago class-password-protection.php 2 years ago class-redirect-after-login.php 2 years ago class-redirect-after-logout.php 2 years ago class-redirect-fourofour.php 2 years ago class-revisions-control.php 2 years ago class-search-engines-visibility.php 2 years ago class-settings-fields-render.php 2 years ago class-settings-sanitization.php 2 years ago class-settings-sections-fields.php 2 years ago class-show-custom-taxonomy-filters.php 2 years ago class-site-identity-on-login-page.php 2 years ago class-svg-upload.php 2 years ago class-various-admin-ui-enhancements.php 2 years ago class-view-admin-as-role.php 2 years ago class-wider-admin-menu.php 2 years ago
class-image-upload-control.php
176 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 /**
13 * Handler for image uploads. Convert and resize images.
14 *
15 * @since 4.3.0
16 */
17 public function image_upload_handler( $upload ) {
18 $applicable_mime_types = array(
19 'image/bmp',
20 'image/x-ms-bmp',
21 'image/png',
22 'image/jpeg',
23 'image/jpg',
24 'image/webp'
25 );
26 if ( in_array( $upload['type'], $applicable_mime_types ) ) {
27 global $png_has_transparency;
28 // Exlude from conversion and resizing images with filenames ending with '-nr', e.g. birds-nr.png
29 if ( false !== strpos( $upload['file'], '-nr.' ) ) {
30 return $upload;
31 }
32 // Convert BMP
33 if ( 'image/bmp' === $upload['type'] || 'image/x-ms-bmp' === $upload['type'] ) {
34 $upload = $this->maybe_convert_image( 'bmp', $upload );
35 }
36 // Convert PNG without transparency
37 if ( 'image/png' === $upload['type'] ) {
38 $upload = $this->maybe_convert_image( 'png', $upload );
39 }
40 // At this point, BMPs and non-transparent PNGs are already converted to JPGs, unless excluded with '-nr' suffix.
41 // Let's perform resize operation as needed, i.e. if image dimension is larger than specified
42 $mime_types_to_resize = array(
43 'image/jpeg',
44 'image/jpg',
45 'image/png',
46 'image/webp'
47 );
48 if ( !is_wp_error( $upload ) && in_array( $upload['type'], $mime_types_to_resize ) && filesize( $upload['file'] ) > 0 ) {
49 // https://developer.wordpress.org/reference/classes/wp_image_editor/
50 $wp_image_editor = wp_get_image_editor( $upload['file'] );
51 if ( !is_wp_error( $wp_image_editor ) ) {
52 $image_size = $wp_image_editor->get_size();
53 $options = get_option( ASENHA_SLUG_U, array() );
54 $max_width = $options['image_max_width'];
55 $max_height = $options['image_max_height'];
56 // Check upload image's dimension and only resize if larger than the defined max dimension
57 if ( isset( $image_size['width'] ) && $image_size['width'] > $max_width || isset( $image_size['height'] ) && $image_size['height'] > $max_height ) {
58 $wp_image_editor->resize( $max_width, $max_height, false );
59 // false is for no cropping
60 if ( 'image/jpg' === $upload['type'] || 'image/jpeg' === $upload['type'] ) {
61 $wp_image_editor->set_quality( 90 );
62 // default is 82
63 }
64 $wp_image_editor->save( $upload['file'] );
65 }
66 }
67 }
68 }
69 return $upload;
70 }
71
72 /**
73 * Convert BMP or PNG without transparency into JPG
74 *
75 * @since 4.3.0
76 */
77 public function maybe_convert_image( $file_extension, $upload ) {
78 global $png_has_transparency;
79 $image_object = null;
80 // Get image object from uploaded BMP/PNG
81 if ( 'bmp' === $file_extension ) {
82 if ( is_file( $upload['file'] ) ) {
83 // Generate image object from BMP for conversion to JPG later
84 if ( function_exists( 'imagecreatefrombmp' ) ) {
85 // PHP >= v7.2
86 $image_object = imagecreatefrombmp( $upload['file'] );
87 } else {
88 // PHP < v7.2
89 require_once ASENHA_PATH . 'includes/bmp-to-image-object.php';
90 $image_object = bmp_to_image_object( $upload['file'] );
91 }
92 }
93 }
94 if ( 'png' === $file_extension ) {
95 // Detect alpha/transparency in PNG
96 $png_has_transparency = false;
97 if ( is_file( $upload['file'] ) ) {
98 // We assume GD library is present, so 'imagecreatefrompng' function is available
99 // Generate image object from PNG for potential conversion to JPG later.
100 $image_object = imagecreatefrompng( $upload['file'] );
101 // Get image dimension
102 list( $width, $height ) = getimagesize( $upload['file'] );
103 // Run through pixels until transparent pixel is found
104 for ($x = 0; $x < $width; $x++) {
105 for ($y = 0; $y < $height; $y++) {
106 $pixel_color_index = imagecolorat( $image_object, $x, $y );
107 $pixel_rgba = imagecolorsforindex( $image_object, $pixel_color_index );
108 // array of red, green, blue and alpha values
109 if ( $pixel_rgba['alpha'] > 0 ) {
110 // a pixel with alpha/transparency has been found
111 // alpha value range from 0 (completely opaque) to 127 (fully transparent).
112 // Ref: https://www.php.net/manual/en/function.imagecolorallocatealpha.php
113 $png_has_transparency = true;
114 break 2;
115 // Break both 'for' loops
116 }
117 }
118 }
119 }
120 // Do not convert PNG with alpha/transparency
121 if ( $png_has_transparency ) {
122 return $upload;
123 }
124 }
125 // When conversion from BMP/PNG to JPG is successful. Last parameter is JPG quality (0-100).
126 if ( is_object( $image_object ) ) {
127 $wp_uploads = wp_upload_dir();
128 $old_filename = wp_basename( $upload['file'] );
129 // Assign new, unique file name for the converted image
130 // $new_filename = wp_basename( str_ireplace( '.' . $file_extension, '.jpg', $old_filename ) );
131 $new_filename = str_ireplace( '.' . $file_extension, '.jpg', $old_filename );
132 $new_filename = wp_unique_filename( dirname( $upload['file'] ), $new_filename );
133 if ( imagejpeg( $image_object, $wp_uploads['path'] . '/' . $new_filename, 90 ) ) {
134 // original image is always deleted in ASE Free
135 $keep_original_image = false;
136 if ( !$keep_original_image ) {
137 unlink( $upload['file'] );
138 }
139 // Add converted JPG info into $upload
140 $upload['file'] = $wp_uploads['path'] . '/' . $new_filename;
141 $upload['url'] = $wp_uploads['url'] . '/' . $new_filename;
142 $upload['type'] = 'image/jpeg';
143 }
144 }
145 return $upload;
146 }
147
148 /**
149 * Generate image object from PNG/JPG with GD library
150 *
151 * @since 6.9.11
152 */
153 public function gd_generate_webp(
154 $file,
155 $file_extension,
156 $webp_path,
157 $webp_conversion_quality
158 ) {
159 if ( 'png' == $file_extension ) {
160 $image_object = imagecreatefrompng( $file );
161 if ( $png_has_transparency ) {
162 imagepalettetotruecolor( $image_object );
163 }
164 }
165 if ( 'jpg' == $file_extension || 'jpeg' == $file_extension ) {
166 $image_object = imagecreatefromjpeg( $file );
167 }
168 // When creation of image object from PNG/JPG is successful. let's generate WebP image
169 // Second parameter is file path, last parameter is WebP quality (0-100).
170 if ( !is_null( $image_object ) && is_object( $image_object ) ) {
171 imagewebp( $image_object, $webp_path, $webp_conversion_quality );
172 }
173 }
174
175 }
176