Php Image Processing

Source: Internet
Author: User
Tags imagecopy
Thumbnails, rotating, and capturing

Thumbnails, rotating, and capturing

Thumbnails, rotation, truncation, watermarks, and rounded corners <无>
   *      Img::get("face/2.jpg")->resize(200,200)->save()->destory(); *      Img::get("face/2.jpg")->thumbnail(200,200)->save()->destory(); *      Img::get("face/2.jpg")->corner()->save()->destory(); *      Img::get("face/2.jpg")->cut(20,20,50,50)->save()->destory(); *      Img::get("face/2.jpg")->rotate(45)->save()->destory(); *      Img::get("face/2.jpg")->draw(Img::get("face/icon.png"), "BR")->save("face/2_logo.jpg")->destory(); * 
* @ Author zhangheng */class Img {protected $ res; protected $ type = null; protected $ alphaed = false; /*** @ return Img */public static function get ($ src) {return new Img ($ src);} function _ construct ($ src = false, $ type = false) {if (is_string ($ src) {if (file_exists ($ src) {$ info = getimagesize ($ src); if ($ info) {if ($ info [2] = IMAGETYPE_JPEG) {$ this-> res = imagecreatefromjpeg ($ src);} else if ($ info [2] = IMAGETYPE_PNG) {$ this-> res = @ imagecreatefrompng ($ src);} else if ($ info [2] = IMAGETYPE_GIF) {$ this-> res = @ imagecreatefromgif ($ src);} else if ($ info [2] = IMAGETYPE_BMP) {$ this-> res = @ imagecreatefromwbmp ($ src);} $ this-> type = self: typeStr ($ info [2]);} else {if (parse_url ($ src, PHP_URL_HOST) {$ src_ret = file_get_contents ($ src); $ info = getimagesizefromstring ($ src_ret); if ($ info) {$ this-> res = @ Imagecreatefromstring ($ src_ret); $ this-> type = self: typeStr ($ info [2]);} else {$ this-> res = @ imagecreatefromstring ($ src) ;}} else if (is_array ($ src) & count ($ src)> 1) {if (isset ($ src [0]) {$ this-> res = imagecreatetruecolor ($ src [0], $ src [1]);} else {$ this-> res = imagecreatetruecolor ($ src ["width"], $ src ["height"]) ;}} else if (is_resource ($ src )) {$ this-> res = $ src; if ($ type) {$ this-> type = $ type;} Else if (get_class ($ src) = get_class ($ this) {$ this-> res = $ src-> res; $ this-> type = $ src-> type;} if (! $ This-> res) {throw new Exception ("ArgumentError :". $ src) ;}} private function up ($ r) {@ imagedestroy ($ this-> res); $ this-> res = $ r ;} /*** stretch to target size * @ param int $ width * @ param int $ height * @ return Img */public function resize ($ width, $ height = false) {$ this-> up (self: resizeImp ($ this-> res, $ width, $ height, false, false); return $ this ;} /*** generate the target size Thumbnail (keep ratio) * @ param int $ width * @ param int $ height * @ Return Img */public function thumbnail ($ width, $ height = false) {$ this-> up (self: resizeImp ($ this-> res, $ width, $ height, true, true); return $ this;}/*** specifies the minimum side. The size is $ size, and keep the ratio * @ param int $ size */public function thumbByMin ($ size) {$ w = $ this-> width (); $ h = $ this-> height (); if ($ w = $ h) {$ w = $ size; $ h = $ size ;} else if ($ w> $ h) {$ w = $ w/$ h * $ size; $ h = $ size ;} else {$ h = $ h/$ w * $ size; $ w = $ siz E ;}$ this-> up (self: resizeImp ($ this-> res, $ w, $ h, false, false); return $ this ;} /*** cut the graph to the target size * @ param int $ x * @ param int $ y * @ param int $ w * @ param int $ h * @ return Img */public function cut ($ x, $ y, $ width, $ height) {$ img = imagecreatetruecolor ($ width, $ height); imagealphablending ($ img, false); imagesavealpha ($ img, true ); imagecopy ($ img, $ this-> res, 0, 0, $ x, $ y, $ this-> width (), $ this-> hei Ght (); imagedestroy ($ this-> res); $ this-> up ($ img); return $ this ;} /*** convert the image to a square shape (the smallest side is used by default) * @ param bool $ small default-true */public function square ($ small = TRUE) {$ w = $ this-> width (); $ h = $ this-> height (); if ($ w! = $ H) {$ s = $ small? Min (array ($ w, $ h): max (array ($ w, $ h); $ this-> resize ($ s, $ s );} return $ this;}/*** square cut * @ param int $ size cut and put it to the target size * @ return Img */public function squareCut ($ size = false) {$ w = $ this-> width (); $ h = $ this-> height (); if ($ w! = $ H) {$ s = min (array ($ w, $ h); $ x = ($ w-$ s)/2; $ y = ($ h-$ s)/2; $ this-> cut ($ x, $ y, $ s, $ s);} if (is_int ($ size) & amp; $ size & gt; 0) {$ this-> resize ($ size);} return $ this ;} /*** create a rounded corner ** @ param number $ percent rounded corner ratio * @ param string $ autoResize automatically adjusts the size (to the square) * @ param number $ quality image quality * @ return Img */public function corner ($ percent = 1.0, $ autoResize = false, $ quality = 4) {if ($ autoResize) {$ this-> square ();} $ w = $ This-> width (); $ h = $ this-> height (); $ src = $ this-> res; $ radius = min (array ($ w, $ h)/2 * $ percent; $ radius * = $ quality; $ nw = $ w * $ quality; $ nh = $ h * $ quality; $ img = imagecreatetruecolor ($ nw, $ nh); // $ alpha = imagecolorallocatealpha ($ img, 255,255,255,127); $ alpha = self: makeColor ($ img, 0x7fffffff ); imagealphablending ($ img, false); imagesavealpha ($ img, true); imagefilledrectangle ($ img, 0, 0, $ nw, $ Nh, $ alpha); imagefill ($ img, 0, 0, $ alpha); imagecopyresampled ($ img, $ src, 0, 0, 0, 0, 0, $ nw, $ nh, $ w, $ h); imagearc ($ img, $ radius-1, $ radius-1, $ radius X 2, $ radius * 2,180,270, $ alpha ); imagefilltoborder ($ img, 0, 0, $ alpha, $ alpha); imagearc ($ img, $ nw-$ radius, $ radius-1, $ radius * 2, $ radius * 2,270, 0, $ alpha); imagefilltoborder ($ img, $ nw-1, 0, $ alpha, $ alpha); imagearc ($ img, $ radius-1, $ nh-$ radius, $ Radius * 2, $ radius * 2, 90,180, $ alpha); imagefilltoborder ($ img, 0, $ nh-1, $ alpha, $ alpha); imagearc ($ img, $ nw-$ radius, $ nh-$ radius, $ radius * 2, $ radius * 2, 0, 90, $ alpha); imagefilltoborder ($ img, $ nw-1, $ nh-1, $ alpha, $ alpha); imagealphablending ($ img, true); imagecolortransparent ($ img, $ alpha); # resize image down $ dest = imagecreatetruecolor ($ w, $ h); imagealphablending ($ dest, false); imagesavealkaline Ha ($ dest, true); imagefilledrectangle ($ dest, 0, 0, $ w, $ h, $ alpha); imagecopyresampled ($ dest, $ img, 0, 0, 0, 0, $ w, $ h, $ nw, $ nh); imagedestroy ($ src); imagedestroy ($ img); $ this-> alphaed = true; $ this-> up ($ dest); return $ this ;} /*** image rotation ** @ param float $ angle * @ param int $ gdg_color * @ return Img */public function rotate ($ angle, $ gdg_color = 0x7fffffff) {$ this-> up (imagerotate ($ this-> res, $ angle, $ Gdg_color); imagealphablending ($ this-> res, true); imagesavealpha ($ this-> res, true); $ this-> alphaed = true; return $ this ;} /***** @ param string $ fontfile * @ param string $ text * @ param int $ offsetX * @ param int $ offsetY * @ param int $ size * @ param int $ angle * @ param real $ color * @ param string $ align * @ return Img */public function write ($ fontfile, $ text, $ offsetX = 0, $ offsetY = 0, $ size = 14, $ Color = 0xff0000, $ angle = 0, $ align = 'br ') {imagealphablending ($ this-> res, true); $ box = imagettfbbox ($ size, $ angle, $ fontfile, $ text); $ w = abs ($ box [2]-$ box [0]); $ h = abs ($ box [3]-$ box [5]); if ($ h <$ size) {$ h = $ size ;}$ x = 0; $ y = 0; self: align ($ align, $ x, $ y, $ w, $ h, $ this-> width (), $ this-> height (), $ offsetX, $ offsetY); // echo "$ x, $ y, $ w, $ h ,". $ this-> width (). "_". $ this-> height (); exit (); imaget Tftext ($ this-> res, $ size, $ angle, $ x, $ y + $ H-3, self: makeColor ($ this-> res, $ color ), $ fontfile, $ text); return $ this ;} /*** draw a watermark image ** @ param string $ img * @ param string $ align * @ param number $ angle * @ param number $ offsetX * @ param number $ offsetY * @ param real $ alpha * @ return Img */public function draw ($ img, $ align = "BR", $ angle = 0, $ offsetX = 0, $ offsetY = 0, $ alpha = 1.0) {$ img = new Img ($ img ); if ($ Angle! = 0) {$ img-> rotate ($ angle);} $ w = $ img-> width (); $ h = $ img-> height (); $ x = 0; $ y = 0; self: align ($ align, $ x, $ y, $ w, $ h, $ this-> width (), $ this-> height (), $ offsetX, $ offsetY); imagealphablending ($ this-> res, true); imagecopy ($ this-> res, $ img-> res, $ x, $ y, 0, 0, $ w, $ h); // copy the watermark to the target file return $ this;} private static function align ($ align, & $ x, & $ y, $ w, $ h, $ bw, $ bh, $ offsetX, $ offsetY) {if ($ align = "BR "){ $ X = ($ bw-$ w-$ offsetX); $ y = ($ bh-$ h-$ offsetY);} else if ($ align = "BL ") {$ x = $ offsetX; $ y = ($ bh-$ h-$ offsetY);} else if ($ align = "TL") {$ x = $ offsetX; $ y = $ offsetY;} else if ($ align = "TR") {$ x = ($ bw-$ w-$ offsetX); $ y = $ offsetY ;} else {$ x = ($ bw-$ w-$ offsetX)/2; $ y = ($ bh-$ h-$ offsetY)/2 ;}} /*** current clip width ** @ return number */public function width () {return imagesx ($ this-> res);}/*** current clip height * @ Return number */public function height () {return imagesy ($ this-> res);}/*** current material resource * @ return resource */public function res () {return $ this-> res ;} /*** save to file * @ param string $ type * @ return Img */public function save ($ file = "", $ type = null) {if ($ type = null) {$ type = $ this-> type; if ($ this-> alphaed) {$ type = "png" ;}} self :: saveTo ($ this-> res, $ file, $ type); return $ This;}/*** destroy the current graph */public function destory () {if ($ this-> res) {@ imagedestroy ($ this-> res ); $ this-> res = false ;}} /*** save ImageResource to the file * @ param resource $ image * @ param string $ file * @ param string $ type */private static function saveTo ($ image, $ file, $ type = "jpg") {if (! $ File | empty ($ file) {$ file = null; header ("content-type: image /". $ type);} if ($ type = "png") {imagepng ($ image, $ file);} else if ($ type = "gif ") {$ transColor = imagecolorallocatealpha ($ image, 255,255,255,127); imagecolortransparent ($ image, $ transColor); imagegif ($ image, $ file);} else {imagejpeg ($ image, $ file, 100) ;}}/*** @ param string $ src image file * @ param int $ width target size * @ param int $ height Target size * @ param string $ toFile: The file is stored after scaling, if this parameter is not set, the source image path * @ param boolean $ ratio * @ param boolean $ thumbnail will be overwritten. If this parameter is set to false, you can only scale in the aspect ratio to true */ private static function resizeImp ($ res, $ width, $ height, $ ratio = TRUE, $ thumbnail = FALSE) {if ($ height = false) {$ height = $ width ;} $ oldW = imagesx ($ res); $ oldH = imagesy ($ res); self: scale ($ width, $ height, $ oldW, $ oldH, $ ratio, $ thumbnail); $ img = imagecreatetr Uecolor ($ width, $ height); $ alpha = imagecolorallocatealpha ($ img, 255,255,255,127); imagefill ($ img, 0, 0, $ alpha); imagecopyresampled ($ img, $ res, 0, 0, 0, 0, $ width, $ height, $ oldW, $ oldH); imagesavealpha ($ img, true); return $ img ;} /*** whether the thumbnail is displayed based on the ratio of whether to maintain the image, calculate the real size after scaling * @ param int $ toWidth * @ param int $ toHeight * @ param int $ srcWidth * @ param int $ srcHeight * @ par Am boolean $ ratio holding ratio * @ param boolean $ thumbnail if it is set to false, it only supports proportional amplification. */private static function scale (& $ toWidth, & $ toHeight, $ srcWidth, $ srcHeight, $ ratio = TRUE, $ thumbnail = FALSE) {if ($ ratio | $ thumbnail) {if ($ thumbnail & ($ srcWidth <$ toWidth & $ srcHeight <$ toHeight) {$ toWidth = $ srcWidth; $ toHeight = $ srcHeight ;} else {if ($ toWidth/$ toHeight) <= ($ srcWidth/$ srcHeight) {$ toHeight = int Val ($ toWidth * ($ srcHeight/$ srcWidth);} else {$ toWidth = intval ($ toHeight * ($ srcWidth/$ srcHeight ));}}}} private static function makeColor ($ img, $ rgba) {$ B = $ rgba & 0xff; $ rgba >>=8; $ g = ($ rgba) & 0xff; $ rgba >>=8; $ r = ($ rgba) & 0xff; $ rgba >>=8; $ a = ($ rgba) & 0xff; $ c = imagecolorallocatealpha ($ img, $ r, $ g, $ B, $ a); if ($ rgba = 0x7fffffff) {imagecolortransparent ($ img, $ c );} return $ c;} pr Ivate static function typeStr ($ type) {if ($ type = IMAGETYPE_PNG) {return "png";} else if ($ type = IMAGETYPE_GIF) {return "gif ";} else if ($ type = IMAGETYPE_BMP) {return "bmp" ;}return "jpg" ;}}?>

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.