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" ;}}?>