PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 7.2.0
Admin and Site Enhancements (ASE) v7.2.0
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
173 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 unlink( $upload['file'] );
135 // delete original BMP/PNG
136 // Add converted JPG info into $upload
137 $upload['file'] = $wp_uploads['path'] . '/' . $new_filename;
138 $upload['url'] = $wp_uploads['url'] . '/' . $new_filename;
139 $upload['type'] = 'image/jpeg';
140 }
141 }
142 return $upload;
143 }
144
145 /**
146 * Generate image object from PNG/JPG with GD library
147 *
148 * @since 6.9.11
149 */
150 public function gd_generate_webp(
151 $file,
152 $file_extension,
153 $webp_path,
154 $webp_conversion_quality
155 ) {
156 if ( 'png' == $file_extension ) {
157 $image_object = imagecreatefrompng( $file );
158 if ( $png_has_transparency ) {
159 imagepalettetotruecolor( $image_object );
160 }
161 }
162 if ( 'jpg' == $file_extension || 'jpeg' == $file_extension ) {
163 $image_object = imagecreatefromjpeg( $file );
164 }
165 // When creation of image object from PNG/JPG is successful. let's generate WebP image
166 // Second parameter is file path, last parameter is WebP quality (0-100).
167 if ( !is_null( $image_object ) && is_object( $image_object ) ) {
168 imagewebp( $image_object, $webp_path, $webp_conversion_quality );
169 }
170 }
171
172 }
173