11<?php
2+ /**
3+ * File contains all the administration image manipulation functions.
4+ *
5+ * @package WordPress
6+ */
7+
8+ /**
9+ * wp_create_thumbnail() - Create a thumbnail from an Image given a maximum side size.
10+ *
11+ * @package WordPress
12+ * @param mixed $file Filename of the original image, Or attachment id
13+ * @param int $max_side Maximum length of a single side for the thumbnail
14+ * @return string Thumbnail path on success, Error string on failure
15+ *
16+ * This function can handle most image file formats which PHP supports.
17+ * If PHP does not have the functionality to save in a file of the same format, the thumbnail will be created as a jpeg.
18+ */
19+ function wp_create_thumbnail ( $ file , $ max_side , $ depreciated = '' ) {
20+ if ( ctype_digit ( $ file ) ) // Handle int as attachment ID
21+ $ file = get_attached_file ( $ file );
222
3- function get_udims ( $ width , $ height ) {
4- if ( $ height <= 96 && $ width <= 128 )
5- return array ( $ width , $ height );
6- elseif ( $ width / $ height > 4 / 3 )
7- return array ( 128 , (int ) ($ height / $ width * 128 ));
8- else
9- return array ( (int ) ($ width / $ height * 96 ), 96 );
10- }
23+ $ image = wp_load_image ( $ file );
24+
25+ if ( !is_resource ( $ image ) )
26+ return $ image ;
1127
12- function wp_create_thumbnail ( $ file , $ max_side , $ effect = '' ) {
28+ list ( $ sourceImageWidth , $ sourceImageHeight , $ sourceImageType ) = getimagesize ( $ file );
1329
14- // 1 = GIF, 2 = JPEG, 3 = PNG
30+ if ( function_exists ( 'imageantialias ' ))
31+ imageantialias ( $ image , true );
1532
16- if ( file_exists ( $ file ) ) {
17- $ type = getimagesize ( $ file );
33+ list ($ image_new_width , $ image_new_height ) = wp_shrink_dimensions ( $ sourceImageWidth , $ sourceImageHeight , $ max_side , $ max_side );
1834
19- // if the associated function doesn't exist - then it's not
20- // handle. duh. i hope.
35+ $ thumbnail = imagecreatetruecolor ( $ image_new_width , $ image_new_height );
36+ @ imagecopyresampled ( $ thumbnail , $ image , 0 , 0 , 0 , 0 , $ image_new_width , $ image_new_height , $ sourceImageWidth , $ sourceImageHeight );
2137
22- if (!function_exists ( 'imagegif ' ) && $ type [2 ] == 1 ) {
23- $ error = __ ( 'Filetype not supported. Thumbnail not created. ' );
24- }
25- elseif (!function_exists ( 'imagejpeg ' ) && $ type [2 ] == 2 ) {
26- $ error = __ ( 'Filetype not supported. Thumbnail not created. ' );
27- }
28- elseif (!function_exists ( 'imagepng ' ) && $ type [2 ] == 3 ) {
29- $ error = __ ( 'Filetype not supported. Thumbnail not created. ' );
30- } else {
31-
32- // create the initial copy from the original file
33- if ( $ type [2 ] == 1 ) {
34- $ image = imagecreatefromgif ( $ file );
35- }
36- elseif ( $ type [2 ] == 2 ) {
37- $ image = imagecreatefromjpeg ( $ file );
38- }
39- elseif ( $ type [2 ] == 3 ) {
40- $ image = imagecreatefrompng ( $ file );
41- }
42-
43- if ( function_exists ( 'imageantialias ' ))
44- imageantialias ( $ image , TRUE );
45-
46- $ image_attr = getimagesize ( $ file );
47-
48- // figure out the longest side
49-
50- if ( $ image_attr [0 ] > $ image_attr [1 ] ) {
51- $ image_width = $ image_attr [0 ];
52- $ image_height = $ image_attr [1 ];
53- $ image_new_width = $ max_side ;
54-
55- $ image_ratio = $ image_width / $ image_new_width ;
56- $ image_new_height = $ image_height / $ image_ratio ;
57- //width is > height
58- } else {
59- $ image_width = $ image_attr [0 ];
60- $ image_height = $ image_attr [1 ];
61- $ image_new_height = $ max_side ;
62-
63- $ image_ratio = $ image_height / $ image_new_height ;
64- $ image_new_width = $ image_width / $ image_ratio ;
65- //height > width
66- }
67-
68- $ thumbnail = imagecreatetruecolor ( $ image_new_width , $ image_new_height );
69- @ imagecopyresampled ( $ thumbnail , $ image , 0 , 0 , 0 , 0 , $ image_new_width , $ image_new_height , $ image_attr [0 ], $ image_attr [1 ] );
70-
71- // If no filters change the filename, we'll do a default transformation.
72- if ( basename ( $ file ) == $ thumb = apply_filters ( 'thumbnail_filename ' , basename ( $ file ) ) )
73- $ thumb = preg_replace ( '!(\.[^.]+)?$! ' , '.thumbnail ' . '$1 ' , basename ( $ file ), 1 );
74-
75- $ thumbpath = str_replace ( basename ( $ file ), $ thumb , $ file );
76-
77- // move the thumbnail to its final destination
78- if ( $ type [2 ] == 1 ) {
79- if (!imagegif ( $ thumbnail , $ thumbpath ) ) {
80- $ error = __ ( "Thumbnail path invalid " );
81- }
82- }
83- elseif ( $ type [2 ] == 2 ) {
84- if (!imagejpeg ( $ thumbnail , $ thumbpath ) ) {
85- $ error = __ ( "Thumbnail path invalid " );
86- }
87- }
88- elseif ( $ type [2 ] == 3 ) {
89- if (!imagepng ( $ thumbnail , $ thumbpath ) ) {
90- $ error = __ ( "Thumbnail path invalid " );
91- }
92- }
38+ imagedestroy ( $ image ); // Free up memory
9339
94- }
95- } else {
96- $ error = __ ( 'File not found ' );
97- }
40+ // If no filters change the filename, we'll do a default transformation.
41+ if ( basename ( $ file ) == $ thumb = apply_filters ( 'thumbnail_filename ' , basename ( $ file ) ) )
42+ $ thumb = preg_replace ( '!(\.[^.]+)?$! ' , '.thumbnail$1 ' , basename ( $ file ), 1 );
9843
99- if (!empty ( $ error ) ) {
100- return $ error ;
101- } else {
102- return apply_filters ( 'wp_create_thumbnail ' , $ thumbpath );
44+ $ thumbpath = str_replace ( basename ( $ file ), $ thumb , $ file );
45+
46+ switch ( $ sourceImageType ){
47+ default : // We'll create a Jpeg if we cant use its native file format
48+ $ thumb = preg_replace ( '/ \\.[^ \\.]+$/ ' , '.jpg ' , $ thumb ); //Change file extension to Jpg
49+ case IMAGETYPE_JPEG :
50+ if (!imagejpeg ( $ thumbnail , $ thumbpath ) )
51+ return __ ( 'Thumbnail path invalid ' );
52+ break ;
53+ case IMAGETYPE_GIF :
54+ if (!imagegif ( $ thumbnail , $ thumbpath ) )
55+ return __ ( 'Thumbnail path invalid ' );
56+ break ;
57+ case IMAGETYPE_PNG :
58+ if (!imagepng ( $ thumbnail , $ thumbpath ) )
59+ return __ ( 'Thumbnail path invalid ' );
60+ break ;
10361 }
62+
63+ imagedestroy ( $ thumbnail ); // Free up memory
64+
65+ // Set correct file permissions
66+ $ stat = stat ( dirname ( $ thumbpath ));
67+ $ perms = $ stat ['mode ' ] & 0000666 ; //same permissions as parent folder, strip off the executable bits
68+ @ chmod ( $ thumbpath , $ perms );
69+
70+ return apply_filters ( 'wp_create_thumbnail ' , $ thumbpath );
10471}
10572
73+ /**
74+ * wp_crop_image() - Crop an Image to a given size.
75+ *
76+ * @package WordPress
77+ * @internal Missing Long Description
78+ * @param int $src_file The source file
79+ * @param int $src_x The start x position to crop from
80+ * @param int $src_y The start y position to crop from
81+ * @param int $src_w The width to crop
82+ * @param int $src_h The height to crop
83+ * @param int $dst_w The destination width
84+ * @param int $dst_h The destination height
85+ * @param int $src_abs If the source crop points are absolute
86+ * @param int $dst_file The destination file to write to
87+ * @return string New filepath on success, String error message on failure
88+ *
89+ */
10690function wp_crop_image ( $ src_file , $ src_x , $ src_y , $ src_w , $ src_h , $ dst_w , $ dst_h , $ src_abs = false , $ dst_file = false ) {
10791 if ( ctype_digit ( $ src_file ) ) // Handle int as attachment ID
10892 $ src_file = get_attached_file ( $ src_file );
@@ -123,9 +107,11 @@ function wp_crop_image( $src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_
123107 imageantialias ( $ dst , true );
124108
125109 imagecopyresampled ( $ dst , $ src , 0 , 0 , $ src_x , $ src_y , $ dst_w , $ dst_h , $ src_w , $ src_h );
110+
111+ imagedestroy ( $ src ); // Free up memory
126112
127- if ( !$ dst_file )
128- $ dst_file = str_replace ( basename ( $ src_file ), 'cropped- ' . basename ( $ src_file ), $ src_file );
113+ if ( ! $ dst_file )
114+ $ dst_file = str_replace ( basename ( $ src_file ), 'cropped- ' . basename ( $ src_file ), $ src_file );
129115
130116 $ dst_file = preg_replace ( '/ \\.[^ \\.]+$/ ' , '.jpg ' , $ dst_file );
131117
@@ -135,15 +121,25 @@ function wp_crop_image( $src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_
135121 return false ;
136122}
137123
124+ /**
125+ * wp_generate_attachment_metadata() - Generate post Image attachment Metadata
126+ *
127+ * @package WordPress
128+ * @internal Missing Long Description
129+ * @param int $attachment_id Attachment Id to process
130+ * @param string $file Filepath of the Attached image
131+ * @return mixed Metadata for attachment
132+ *
133+ */
138134function wp_generate_attachment_metadata ( $ attachment_id , $ file ) {
139135 $ attachment = get_post ( $ attachment_id );
140136
141137 $ metadata = array ();
142138 if ( preg_match ('!^image/! ' , get_post_mime_type ( $ attachment )) ) {
143- $ imagesize = getimagesize ($ file );
144- $ metadata ['width ' ] = $ imagesize [' 0 ' ];
145- $ metadata ['height ' ] = $ imagesize [' 1 ' ];
146- list ($ uwidth , $ uheight ) = get_udims ($ metadata ['width ' ], $ metadata ['height ' ]);
139+ $ imagesize = getimagesize ( $ file );
140+ $ metadata ['width ' ] = $ imagesize [0 ];
141+ $ metadata ['height ' ] = $ imagesize [1 ];
142+ list ($ uwidth , $ uheight ) = wp_shrink_dimensions ($ metadata ['width ' ], $ metadata ['height ' ]);
147143 $ metadata ['hwstring_small ' ] = "height=' $ uheight' width=' $ uwidth' " ;
148144 $ metadata ['file ' ] = $ file ;
149145
@@ -160,33 +156,70 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) {
160156 return apply_filters ( 'wp_generate_attachment_metadata ' , $ metadata );
161157}
162158
159+ /**
160+ * wp_load_image() - Load an image which PHP Supports.
161+ *
162+ * @package WordPress
163+ * @internal Missing Long Description
164+ * @param string $file Filename of the image to load
165+ * @return resource The resulting image resource on success, Error string on failure.
166+ *
167+ */
163168function wp_load_image ( $ file ) {
164169 if ( ctype_digit ( $ file ) )
165170 $ file = get_attached_file ( $ file );
166171
167- if ( !file_exists ( $ file ) )
172+ if ( ! file_exists ( $ file ) )
168173 return sprintf (__ ("File '%s' doesn't exist? " ), $ file );
169174
170175 if ( ! function_exists ('imagecreatefromstring ' ) )
171176 return __ ('The GD image library is not installed. ' );
172177
173- $ contents = file_get_contents ( $ file );
174-
175- $ image = imagecreatefromstring ( $ contents );
178+ $ image = @imagecreatefromstring ( @file_get_contents ( $ file ) );
176179
177180 if ( !is_resource ( $ image ) )
178181 return sprintf (__ ("File '%s' is not an image. " ), $ file );
179182
180183 return $ image ;
181184}
182185
186+ /**
187+ * get_udims() - Calculated the new dimentions for downsampled images
188+ *
189+ * @package WordPress
190+ * @internal Missing Description
191+ * @see wp_shrink_dimensions()
192+ * @param int $width Current width of the image
193+ * @param int $height Current height of the image
194+ * @return mixed Array(height,width) of shrunk dimensions.
195+ *
196+ */
197+ function get_udims ( $ width , $ height ) {
198+ return wp_shrink_dimensions ( $ width , $ height );
199+ }
200+ /**
201+ * wp_shrink_dimensions() - Calculates the new dimentions for a downsampled image.
202+ *
203+ * @package WordPress
204+ * @internal Missing Long Description
205+ * @param int $width Current width of the image
206+ * @param int $height Current height of the image
207+ * @param int $wmax Maximum wanted width
208+ * @param int $hmax Maximum wanted height
209+ * @return mixed Array(height,width) of shrunk dimensions.
210+ *
211+ */
183212function wp_shrink_dimensions ( $ width , $ height , $ wmax = 128 , $ hmax = 96 ) {
184- if ( $ height <= $ hmax && $ width <= $ wmax )
213+ if ( $ height <= $ hmax && $ width <= $ wmax ){
214+ //Image is smaller than max
185215 return array ( $ width , $ height );
186- elseif ( $ width / $ height > $ wmax / $ hmax )
216+ } elseif ( $ width / $ height > $ wmax / $ hmax ) {
217+ //Image Width will be greatest
187218 return array ( $ wmax , (int ) ($ height / $ width * $ wmax ));
188- else
219+ } else {
220+ //Image Height will be greatest
189221 return array ( (int ) ($ width / $ height * $ hmax ), $ hmax );
222+ }
190223}
191224
192225?>
0 commit comments