清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | /** * 图片缩放水印类 * * @version 1.0 ; * */ class cls_photo { protected $waterrate = 0.2; //水印图标在图片上的比例 protected $width = 300; //缩略图默认宽度 protected $height = 200; //缩略图默认高度 protected $padding = 5; //水印图到边的距离 protected $water_mark = "./water.png" ; protected $water_mark_pos = 5; //水印图片位置(1=左上角,2=右上角,3=左下角,4=右下角,5中央) protected $watermode = 0; // 0缩略图时不打水印 1缩略图时打水印 protected $magick_handle ; //图片操作句柄 protected $format = array ( 'jpg' , 'gif' , 'png' , 'jpeg' ); // 图片文件格式限定 protected $smallpic_mode = 2; //默认模式 0为不生成缩略图, 1为裁切缩放 ,2为比例缩放 3为缩放填充模式 /** * 设置图片类参数 * * @param $arg 图片参数 多次可放入数组里 如下 * @param $protected 参数值 * array( * 'waterrate'=>0.2, * 'water_mark'=>'./water.png', * 'water_mark_pos'=>4, * 'smallpic_mode'=>1 * ); * @return ture/false */ public function set_args( $arg , $val = "" ) { $params = array ( 'waterrate' , 'water_mark' , 'water_mark_pos' , 'smallpic_mode' , 'watermode' , 'width' , 'height' ); if ( is_array ( $arg )) { foreach ( $arg as $k => $v ) { if (in_array( $k , $params )) { $this -> $k = $v ; } } } else { if ( empty ( $val )) { return false; } else { if (in_array( $arg , $params )) { $this -> $arg = $val ; } } } return true; } /** * 图片缩放 * * @param $src_file 源文件路径 * @param $dst_file 目标文件路径 * @return 缩略图片路径/false */ public function scale( $src_file , $dst_file = "" ) { $dst_width = $this ->width; $dst_height = $this ->height; $mode = $this ->smallpic_mode; $magic_water_handle = NewMagickWand(); if (!MagickReadImage( $magic_water_handle , $src_file )) return false; //类型 $srcext = strtolower (MagickGetImageFormat( $magic_water_handle )); if ( $srcext == 'bmp' ) { $srcext = 'jpeg' ; } if (!in_array( $srcext , $this ->format)) return false; //尺寸 $src_width = MagickGetImageWidth( $magic_water_handle ); $src_height = MagickGetImageHeight( $magic_water_handle ); //裁切缩放模式 if ( $mode == 1) { $pos_x = $pos_y = 0; //裁切临时位置 $src_widthc = $src_width ; //裁切临时宽度 $src_heightc = $src_height ; //裁切临时高度 if ( $src_width / $src_height > $dst_width / $dst_height ) { $src_widthc = $src_height * $dst_width / $dst_height ; $pos_x = ( $src_width - $src_widthc )/2; } else { $src_heightc = $src_width * $dst_height / $dst_width ; $pos_y = ( $src_height - $src_heightc )/2; } MagickCropImage( $magic_water_handle , $src_widthc , $src_heightc , $pos_x , $pos_y ); //裁切 //因为MagickCropImage函数后,Gif 图像改,但画布不变 $this ->magick_handle = NewMagickWand(); MagickNewImage( $this ->magick_handle, $src_widthc , $src_heightc , '#ffffff' ); MagickSetFormat( $this ->magick_handle, $srcext ); MagickCompositeImage( $this ->magick_handle, $magic_water_handle ,MW_OverCompositeOp,0,0); //缩放 MagickScaleImage( $this ->magick_handle, $dst_width , $dst_height ); } //比例缩放模式 if ( $mode == 2) { if ( $src_width / $src_height > $dst_width / $dst_height ) { $dst_height = $dst_width * $src_height / $src_width ; } else { $dst_width = $dst_height * $src_width / $src_height ; } $this ->magick_handle= $magic_water_handle ; //替换 MagickScaleImage( $this ->magick_handle, $dst_width , $dst_height ); //缩放 } //缩放填充模式 if ( $mode == 3) { if ( $src_width / $src_height > $dst_width / $dst_height ) { $dst_heightc = $dst_width * $src_height / $src_width ; $dst_widthc = $dst_width ; } else { $dst_widthc = $dst_height * $src_width / $src_height ; $dst_heightc = $dst_height ; } MagickScaleImage( $magic_water_handle , $dst_widthc , $dst_heightc ); //缩放 $this ->magick_handle = NewMagickWand(); MagickNewImage( $this ->magick_handle, $dst_width , $dst_height , $this ->smallpic_bgcolor); MagickSetFormat( $this ->magick_handle, $srcext ); MagickCompositeImage( $this ->magick_handle, $magic_water_handle ,MW_OverCompositeOp,( $dst_width - $dst_widthc )/2,( $dst_height - $dst_heightc )/2); } //打水印 if ( $this ->watermode == 1) { $this ->set_mark(); } if ( empty ( $dst_file )) { //建立临时文件 $dst_file = tempnam( $_SERVER [ "SINASRV_CACHE_DIR" ], "TMP_IMG" ); } MagickWriteImage( $this ->magick_handle, $dst_file ); return $dst_file ; } /** * 打水印 * * @param $src_file 要打水印的图片路径 * @param $dst_file 生产水印的文件保存路径,为空则生产随机临时文件 * @return 水印文件路径/false */ public function water_mark( $src_file , $dst_file = "" ) { $this ->magick_handle = NewMagickWand(); if (!MagickReadImage( $this ->magick_handle, $src_file )) return false; $this ->set_mark(); if ( empty ( $dst_file )) { //建立临时文件 $dst_file = tempnam( $_SERVER [ "SINASRV_CACHE_DIR" ], "TMP_IMG" ); } MagickWriteImage( $this ->magick_handle, $dst_file ); return $dst_file ; } /** * 对内接口 * 给图片打水印 * */ protected function set_mark() { //尺寸 $dst_width = MagickGetImageWidth( $this ->magick_handle); $dst_height = MagickGetImageHeight( $this ->magick_handle); //处理水印图 if ( $this ->water_mark && is_file ( $this ->water_mark)) { $magic_water_handle = NewMagickWand(); MagickRemoveImage( $magic_water_handle ); if (MagickReadImage( $magic_water_handle , $this ->water_mark)) { MagickScaleImage( $magic_water_handle , $dst_width * $this ->waterrate, $dst_width * $this ->waterrate*MagickGetImageHeight( $magic_water_handle )/MagickGetImageWidth( $magic_water_handle )); //缩放水印到图片的1/5 if ( $this ->water_mark_pos == 1) { $left = $this ->padding; $top = $this ->padding; } elseif ( $this ->water_mark_pos == 2) { $left = $dst_width - $this ->padding-MagickGetImageWidth( $magic_water_handle ); $top = $this ->padding; } elseif ( $this ->water_mark_pos == 3) { $left = $this ->padding; $top = $dst_height - $this ->padding-MagickGetImageHeight( $magic_water_handle ); } elseif ( $this ->water_mark_pos == 4) { $left = $dst_width - $this ->padding-MagickGetImageWidth( $magic_water_handle ); $top = $dst_height - $this ->padding-MagickGetImageHeight( $magic_water_handle ); } elseif ( $this ->water_mark_pos == 5) { $left = ( $dst_width -MagickGetImageWidth( $magic_water_handle ))/2; $top =( $dst_height -MagickGetImageHeight( $magic_water_handle ))/2; } MagickCompositeImage( $this ->magick_handle, $magic_water_handle ,MW_OverCompositeOp, $left , $top ); } } } } |