[PHP] PHP image cropping and cropping source code and usage-php Tutorial

Source: Internet
Author: User
Tags imagecopy transparent color
[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
  • Contact Us

    The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

    If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.