[PHP] PHP image cropping, scaling down, and cropping source code and usage reasons
Recently, for an open-source project that is used to drag and drop verification codes on webpages, you need to generate removable color blocks for images on the server. However, resources on the Internet are thumbnails to scale the entire image, completed the tool for cropping small pieces of images.
CODE
Src_file = $ src_file; $ this-> dst_file = $ dst_file; $ this-> LoadImage ();} function SetSrcFile ($ src_file) {$ this-> src_file = $ src_file ;} function SetDstFile ($ dst_file) {$ this-> dst_file = $ dst_file;} function LoadImage () {list ($ this-> src_width, $ this-> src_height, $ this-> src_type) = getimagesize ($ this-> src_file); switch ($ this-> src_type) {case IMAGETYPE_JPEG: $ this-> sImage = imagecreatefromjpeg ($ this-> src_fil E); $ this-> ext = 'jpg '; break; case IMAGETYPE_PNG: $ this-> sImage = imagecreatefrompng ($ this-> src_file ); $ this-> ext = 'PNG '; break; case IMAGETYPE_GIF: $ this-> sImage = imagecreatefromgif ($ this-> src_file); $ this-> ext = 'GIF '; break; default: exit () ;}} function SaveImage ($ fileName = '') {$ this-> dst_file = $ fileName? $ FileName: $ this-> dst_file; switch ($ this-> src_type) {case IMAGETYPE_JPEG: imagejpeg ($ this-> dImage, $ this-> dst_file, 100); break; case IMAGETYPE_PNG: imagepng ($ this-> dImage, $ this-> dst_file); break; case IMAGETYPE_GIF: imagegif ($ this-> dImage, $ this-> dst_file); break; default: break ;}} function OutImage () {switch ($ this-> src_type) {case IMAGETYPE_JPEG: header ('content-type: image/jpeg '); imagejp Eg ($ this-> dImage); break; case IMAGETYPE_PNG: header ('content-type: image/png '); imagepng ($ this-> dImage); break; case IMAGETYPE_GIF: header ('content-type: image/GIF'); imagegif ($ this-> dImage); break; default: break ;}} function SaveAlpha ($ fileName = '') {$ this-> dst_file = $ fileName? $ FileName. '.png ': $ this-> dst_file .'.png'; imagesavealpha ($ this-> dImage, true); imagepng ($ this-> dImage, $ this-> dst_file );} function OutAlpha () {imagesavealpha ($ this-> dImage, true); header ('content-type: image/png '); imagepng ($ this-> dImage );} function destory () {imagedestroy ($ this-> sImage); imagedestroy ($ this-> dImage);} function Crop ($ dst_width, $ dst_height, $ mode = 1, $ dst_file = '') {if ($ dst_file) $ This-> dst_file = $ dst_file; $ this-> dImage = imagecreatetruecolor ($ dst_width, $ dst_height); $ bg = imagecolorallocatealpha ($ this-> dImage, 255,255,255,127 ); imagefill ($ this-> dImage, 0, 0, $ bg); imagecolortransparent ($ this-> dImage, $ bg ); $ ratio_w = 1.0 * $ dst_width/$ this-> src_width; $ ratio_h = 1.0 * $ dst_height/$ this-> src_height; $ ratio = 1.0; switch ($ mode) {case 1: // always crop if ($ ratio_w <1 & $ rati O_h <1) | ($ ratio_w> 1 & $ ratio_h> 1) {$ ratio = $ ratio_w <$ ratio_h? $ Ratio_h: $ ratio_w; $ tmp_w = (int) ($ dst_width/$ ratio); $ tmp_h = (int) ($ dst_height/$ ratio ); $ tmp_img = imagecreatetruecolor ($ tmp_w, $ tmp_h); $ src_x = (int) ($ this-> src_width-$ tmp_w)/2); $ src_y = (int) ($ this-> src_height-$ tmp_h)/2); imagecopy ($ tmp_img, $ this-> sImage, 0, 0, $ src_x, $ src_y, $ tmp_w, $ tmp_h); imagecopyresampled ($ this-> dImage, $ tmp_img, 0, 0, 0, $ dst_width, $ dst_height, $ tmp_w, $ tmp_h); ima Gedestroy ($ tmp_img);} else {$ ratio = $ ratio_w <$ ratio_h? $ Ratio_h: $ ratio_w; $ tmp_w = (int) ($ this-> src_width * $ ratio); $ tmp_h = (int) ($ this-> src_height * $ ratio ); $ tmp_img = values ($ tmp_w, $ tmp_h); imagecopyresampled ($ tmp_img, $ this-> sImage, $ tmp_w, $ tmp_h, $ this-> src_width, $ this-> src_height); $ src_x = (int) ($ tmp_w-$ dst_width)/2; $ src_y = (int) ($ tmp_h-$ dst_height)/2; imagecopy ($ this-> dImage, $ tmp_img, 0, $ src_x, $ src_y, $ dst_w Idth, $ dst_height); imagedestroy ($ tmp_img);} break; case 2: // only small if ($ ratio_w <1 & $ ratio_h <1) {$ ratio = $ ratio_w <$ ratio_h? $ Ratio_h: $ ratio_w; $ tmp_w = (int) ($ dst_width/$ ratio); $ tmp_h = (int) ($ dst_height/$ ratio ); $ tmp_img = imagecreatetruecolor ($ tmp_w, $ tmp_h); $ src_x = (int) ($ this-> src_width-$ tmp_w)/2; $ src_y = (int) ($ this-> src_height-$ tmp_h)/2; imagecopy ($ tmp_img, $ this-> sImage, 0, $ src_x, $ src_y, $ tmp_w, $ tmp_h ); imagecopyresampled ($ this-> dImage, $ tmp_img, 0, 0, 0, $ dst_width, $ dst_height, $ tmp_w, $ tmp_h); imagede Stroy ($ tmp_img);} elseif ($ ratio_w> 1 & $ ratio_h> 1) {$ dst_x = (int) abs ($ dst_width-$ this-> src_width) /2; $ dst_y = (int) abs ($ dst_height-$ this-> src_height)/2; imagecopy ($ this-> dImage, $ this-> sImage, $ dst_x, $ dst_y, 0, 0, $ this-> src_width, $ this-> src_height);} else {$ src_x = 0; $ dst_x = 0; $ src_y = 0; $ dst_y = 0; if ($ dst_width-$ this-> src_width) <0) {$ src_x = (int) ($ this-> src_width-$ dst_width)/2; $ ds T_x = 0;} else {$ src_x = 0; $ dst_x = (int) ($ dst_width-$ this-> src_width)/2 ;} if ($ dst_height-$ this-> src_height) <0) {$ src_y = (int) ($ this-> src_height-$ dst_height)/2; $ dst_y = 0;} else {$ src_y = 0; $ dst_y = (int) ($ dst_height-$ this-> src_height)/2 ;} imagecopy ($ this-> dImage, $ this-> sImage, $ dst_x, $ dst_y, $ src_x, $ src_y, $ this-> src_width, $ this-> src_height );} break; case 3: // keep all image siz E and create need size if ($ ratio_w> 1 & $ ratio_h> 1) {$ dst_x = (int) (abs ($ dst_width-$ this-> src_width) /2); $ dst_y = (int) (abs ($ dst_height-$ this-> src_height)/2); imagecopy ($ this-> dImage, $ this-> sImage, $ dst_x, $ dst_y, 0, 0, $ this-> src_width, $ this-> src_height);} else {$ ratio = $ ratio_w> $ ratio_h? $ Ratio_h: $ ratio_w; $ tmp_w = (int) ($ this-> src_width * $ ratio); $ tmp_h = (int) ($ this-> src_height * $ ratio ); $ tmp_img = values ($ tmp_w, $ tmp_h); imagecopyresampled ($ tmp_img, $ this-> sImage, $ tmp_w, $ tmp_h, $ this-> src_width, $ this-> src_height); $ dst_x = (int) (abs ($ tmp_w-$ dst_width)/2); $ dst_y = (int) (abs ($ tmp_h-$ dst_height)/2); imagecopy ($ this-> dImage, $ tmp_img, $ dst_x, $ dst_y, 0, 0, $ Tmp_w, $ tmp_h); imagedestroy ($ tmp_img);} break; case 4: // keep all image but create actually size if ($ ratio_w> 1 & $ ratio_h> 1) {$ this-> dImage = imagecreatetruecolor ($ this-> src_width, $ this-> src_height); imagecopy ($ this-> dImage, $ this-> sImage, 0, 0, 0, $ this-> src_width, $ this-> src_height);} else {$ ratio = $ ratio_w> $ ratio_h? $ Ratio_h: $ ratio_w; $ tmp_w = (int) ($ this-> src_width * $ ratio); $ tmp_h = (int) ($ this-> src_height * $ ratio ); $ this-> dImage = imagecreatetruecolor ($ tmp_w, $ tmp_h); imagecopyresampled ($ this-> dImage, $ this-> sImage, 0, 0, 0, $ tmp_w, $ tmp_h, $ this-> src_width, $ this-> src_height);} break ;}} // end Crop/***** cropping method * 15:05:44 * Lixiaoyu ** @ param $ dst_width target length * @ param $ dst_height target height * @ param $ d Distance between the st_x cropping part and the left side of the source image * @ param $ dst_y distance between the cropping part and the right side of the source image * @ param int $ mode * @ param string $ dst_file target file path */function Cut ($ dst_width, $ dst_height, $ dst_x, $ dst_y, $ dst_file = '') {if ($ dst_file) $ this-> dst_file = $ dst_file; // set the target file location $ this-> dImage = imagecreatetruecolor ($ dst_width, $ dst_height ); // Create a canvas of the target File Size $ bg = imagecolorallocatealpha ($ this-> dImage, 255,255,255,127); // assign the image fill color to the canvas ($ this-> dI Mage, 0, 0, $ bg); // fill the image with color in imagecolortransparent ($ this-> dImage, $ bg ); // The background is defined as transparent color $ ratio_w = 1.0 * $ dst_width/$ this-> src_width; // scale horizontally $ ratio_h = 1.0 * $ dst_height/$ this-> src_height; // var_dump ($ this); // crop the image without scaling. $ ratio = 1.0; $ tmp_w = (int) ($ dst_width/$ ratio); $ tmp_h = (int) ($ dst_height/$ ratio); $ tmp_img = imagecreatetruecolor ($ dst_width, $ dst_height ); // Create a temporarily saved canvas ima Gecopy ($ tmp_img, $ this-> sImage, $ dst_x, $ dst_y, $ dst_width, $ dst_height); // Copy part of the image, crop imagecopyresampled ($ this-> dImage, $ tmp_img, $ dst_width, $ dst_height, $ tmp_w, $ tmp_h); // save the image temporarily cached, put it in the target file imagedestroy ($ tmp_img) ;}}?>
Use crop images
$ Ic = new ImageCrop ($ pathToFile ,'. /pic/afterCrop'.time().'.jpg '); $ ic-> Cut (120,130,); $ ic-> SaveImage (); // $ ic-> SaveAlpha (); convert the padding into transparent pixels and save $ ic-> destory ();
Effect
SOURCE image
Cropped graph
Zoom image
SOURCE image
Thumbnail
Key and difficulties
Focus on using image processing functions imagecopy and imagecopyresampled
Bool imagecopy (resource dstim, resource src_im, int dstx, int dst_y, int srcx, int src_y, int srcw, int src_h)
Copy the coordinates of the src_im image from src_x, src_y, src_w in width, and src_h in height to the position where the coordinates of dst_im are dst_x and dst_y.
References
Http://www.php.net/manual/zh/function.imagecopy.php
Http://php.net/manual/zh/function.imagecopyresampled.php