1. <?php
  2. class ThumbWaterImages{
  3. /**
  4. * 生成缩略图/加水印
  5. * classname ThumbWaterImages
  6. * datetime:2015-1-15
  7. * author:chenpz
  8. *
  9. * usuage:
  10. * $th=new ThumbWaterImages(array('imagePre'=>'example', 'imagePath'=>'./uploads/thumb/', 'echoType'=>'file'));
  11. * $th->setThumb($srcImage, 384, 300, 'prorate');
  12. */
  13.  
  14. private $imagepre; //缩略图名称前缀
  15. private $imagepath; //缩略图存放路径
  16. private $srcImage=''; //源图路径
  17. private $newImageName; //缩略图名称
  18. private $imageType; //图片类型
  19. private $echotype; //输出图片类型,link--直接输出到浏览器;file--保存为文件
  20. private $im=''; //临时变量
  21. private $originName=''; //源图名称
  22. private $srcW=''; //源图宽
  23. private $srcH=''; //源图高
  24. private $errorNum=0; //错误号
  25. private $errorMess=''; //用来提供错误报告
  26.  
  27. /**
  28. * 初始化
  29. * @access public
  30. * @param array
  31. * @return void
  32. */
  33. public function __construct($options = array()){
  34. $allowOption = array('imagepre','imagepath','echotype');
  35. foreach($options as $key=>$val){
  36. $key = strtolower($key);
  37. //验证成员属性
  38. if(!in_array($key, $allowOption)){
  39. $this->errorNum = -3;
  40. $this->errorMess = $this->getError();
  41. continue;
  42. }
  43. $this->$key = $val;
  44. }
  45. }
  46.  
  47. /**
  48. *
  49. * 判断源文件路径、缩略图存放路径是否正确
  50. * 判断GD库是否支持缩略图格式
  51. * 初始化图片高宽、缩略图存放路径、缩略图生成方式
  52. *
  53. * @access public
  54. * @param string $srcImage
  55. * @param int $toW
  56. * @param int $toH
  57. * @param string $method
  58. * prorate 按比例缩放/distortion 扭曲型缩图/cut 最小裁剪后的缩图/backFill 背景填充图
  59. * @param string $echotype
  60. */
  61. public function setThumb($srcImage = '', $toW = 0, $toH = 0, $method = 'distortion'){
  62. $this->srcImage = $srcImage;
  63. $imageName = explode('/', $this->srcImage);
  64. $this->originName = $imageName[2];
  65. //检查源文件是否存在
  66. if(empty($srcImage) || filetype($srcImage) != 'file'){
  67. $this->errorNum = 4;
  68. $this->errorMess = $this->getError();
  69. return false;
  70. }
  71. //检查文件上传路径
  72. if ($this->echotype == 'file'){
  73. if(!$this->checkImagePath()){
  74. $this->errorMess = $this->getError();
  75. return false;
  76. }
  77. }
  78. $info = '';
  79. $data = getimagesize($this->srcImage, $info);//获取图像大小
  80. $this->srcW = $data[0];//宽
  81. $this->srcH = $data[1];//高
  82. //检查GD库
  83. if(!$this->checkGD($data[2])){
  84. $this->errorMess = $this->getError();
  85. return false;
  86. }
  87. $this->setImageName();//设置缩略图名称
  88. $toFile = $this->imagepath.$this->newImageName;//缩略图存放路径
  89. $return = $this->createImageMethod($method, $toFile, $toW, $toH);
  90. return $return;
  91. }
  92.  
  93. /**
  94. *
  95. * 初始化缩略图生成方式
  96. * prorate 按比例缩放
  97. * distortion 扭曲型缩图
  98. * cut 最小裁剪后的缩图
  99. * backFill 背景填充图
  100. * @param string $method
  101. * @param string $toFile
  102. * @param int $toW
  103. * @param int $toH
  104. */
  105. private function createImageMethod($method, $toFile, $toW, $toH){
  106. switch ($method){
  107. case 'prorate':
  108. $return = $this->prorate($toFile, $toW, $toH);
  109. break;
  110. case 'cut':
  111. $return = $this->cut($toFile, $toW, $toH);
  112. break;
  113. case 'backFill':
  114. $return = $this->backFill($toFile, $toW, $toH);
  115. break;
  116. default:
  117. $return = $this->distortion($toFile, $toW, $toH);
  118. }
  119. return $return;
  120. }
  121. //生成扭曲型缩图
  122. function distortion($toFile='', $toW=0, $toH=0){
  123. $cImg=$this->creatImage($this->im, $toW, $toH, 0, 0, 0, 0, $this->srcW, $this->srcH);
  124. return $this->echoImage($cImg, $toFile);
  125. imagedestroy($cImg);
  126. }
  127.  
  128. //生成按比例缩放的缩图
  129. function prorate($toFile, $toW, $toH){
  130. $toWH = $toW / $toH;
  131. $srcWH = $this->srcW / $this->srcH;
  132. if($toWH <= $srcWH){
  133. $ftoW = $toW;
  134. $ftoH = $ftoW * ($this->srcH / $this->srcW);
  135. }else{
  136. $ftoH = $toH;
  137. $ftoW = $ftoH * ($this->srcW / $this->srcH);
  138. }
  139. if($this->srcW > $toW || $this->srcH > $toH){
  140. $cImg = $this->creatImage($this->im, $ftoW, $ftoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
  141. return $this->echoImage($cImg, $toFile);
  142. imagedestroy($cImg);
  143. }else{
  144. $cImg = $this->creatImage($this->im, $this->srcW, $this->srcH, 0, 0, 0, 0, $this->srcW, $this->srcH);
  145. return $this->echoImage($cImg, $toFile);
  146. imagedestroy($cImg);
  147. }
  148. }
  149.  
  150. //生成最小裁剪后的缩图
  151. private function cut($toFile, $toW, $toH){
  152. $toWH = $toW/$toH;
  153. $srcWH = $this->srcW / $this->srcH;
  154. if($toWH <= $srcWH){
  155. $ctoH = $toH;
  156. $ctoW = $ctoH * ($this->srcW / $this->srcH);
  157. }else{
  158. $ctoW = $toW;
  159. $ctoH = $ctoW * ($this->srcH / $this->srcW);
  160. }
  161. $allImg = $this->creatImage($this->im, $ctoW, $ctoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
  162. $cImg = $this->creatImage($allImg, $toW, $toH, 0, 0, ($ctoW-$toW) / 2, ($ctoH-$toH) / 2, $toW, $toH);
  163. return $this->echoImage($cImg, $toFile);
  164. imagedestroy($cImg);
  165. imagedestroy($allImg);
  166. }
  167.  
  168. //生成背景填充的缩图
  169. private function backFill($toFile, $toW, $toH, $bk1=255, $bk2=255, $bk3=255){
  170. $toWH = $toW / $toH;
  171. $srcWH = $this->srcW / $this->srcH;
  172. if($toWH <= $srcWH){
  173. $ftoW = $toW;
  174. $ftoH = $ftoW * ($this->srcH / $this->srcW);
  175. }else{
  176. $ftoH = $toH;
  177. $ftoW = $ftoH*($this->srcW / $this->srcH);
  178. }
  179. if(function_exists("imagecreatetruecolor")){
  180. @$cImg = imagecreatetruecolor($toW,$toH);
  181. if(!$cImg){
  182. $cImg = imagecreate($toW,$toH);
  183. }
  184. }else{
  185. $cImg = imagecreate($toW,$toH);
  186. }
  187. $backcolor = imagecolorallocate($cImg, $bk1, $bk2, $bk3); //填充的背景颜色
  188. imagefilledrectangle($cImg,0,0,$toW,$toH,$backcolor);
  189. if($this->srcW > $toW || $this->srcH > $toH){
  190. $proImg = $this->creatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);
  191. if($ftoW < $toW){
  192. imagecopy($cImg, $proImg, ($toW - $ftoW) / 2, 0, 0, 0, $ftoW, $ftoH);
  193. }else if($ftoH < $toH){
  194. imagecopy($cImg, $proImg, 0, ($toH-$ftoH) / 2, 0, 0, $ftoW, $ftoH);
  195. }else{
  196. imagecopy($cImg, $proImg, 0, 0, 0, 0, $ftoW, $ftoH);
  197. }
  198. }else{
  199. imagecopymerge($cImg, $this->im, ($toW - $ftoW) / 2,($toH - $ftoH) / 2, 0, 0, $ftoW, $ftoH, 100);
  200. }
  201. return $this->echoImage($cImg, $toFile);
  202. imagedestroy($cImg);
  203. }
  204. //创建图像
  205. private function creatImage($img, $creatW, $creatH, $dstX, $dstY, $srcX, $srcY, $srcImgW, $srcImgH){
  206. if(function_exists("imagecreatetruecolor")){
  207. @$creatImg = imagecreatetruecolor($creatW, $creatH);
  208. if($creatImg){
  209. imagecopyresampled($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
  210. }else{
  211. $creatImg=imagecreate($creatW,$creatH);
  212. imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
  213. }
  214. }else{
  215. $creatImg=imagecreate($creatW, $creatH);
  216. imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
  217. }
  218. return $creatImg;
  219. }
  220.  
  221. //输出图片,link---只输出,不保存文件。file--保存为文件
  222. function echoImage($img, $toFile){
  223. switch($this->echotype){
  224. case 'link':
  225. if(function_exists('imagejpeg'))
  226. return imagejpeg($img);
  227. else
  228. return imagepng($img);
  229. break;
  230. case 'file':
  231. if(function_exists('imagejpeg'))
  232. return imagejpeg($img,$toFile);
  233. else
  234. return imagepng($img,$toFile);
  235. break;
  236. }
  237. }
  238. /**
  239. *
  240. * 设置随机文件名称
  241. * @access private
  242. * @return string
  243. */
  244. private function setRandName(){
  245. $fileName = date("YmdHis").rand(100,999);
  246. return $fileName.'.'.$this->imageType;
  247. }
  248. private function setImageName(){
  249. if ($this->imagepre != ''){
  250. $this->newImageName = $this->imagepre.'_'.$this->setRandName();
  251. }else {
  252. $this->newImageName = $this->setRandName();
  253. }
  254. }
  255. /**
  256. *
  257. * 用来检查文件上传路径
  258. * @access private
  259. * @return bool
  260. */
  261. private function checkImagePath(){
  262. if(empty($this->imagepath)) {
  263. $this->errorNum = -2;
  264. return false;
  265. }
  266.  
  267. if(!file_exists($this->imagepath) || !is_writable($this->imagepath)){
  268. if(!@mkdir($this->imagepath, 0755,true)){
  269. $this->errorNum = -1;
  270. return false;
  271. }
  272. }
  273. return true;
  274. }
  275. private function checkGD($imageType){
  276. switch ($imageType){
  277. case 1:
  278. if(!function_exists("imagecreatefromgif")){
  279. $this->errorNum = 1;
  280. return false;
  281. }
  282. $this->imageType = 'gif';
  283. $this->im = imagecreatefromgif($this->srcImage);
  284. break;
  285. case 2:
  286. if(!function_exists("imagecreatefromjpeg")){
  287. $this->errorNum = 2;
  288. return false;
  289. }
  290. $this->imageType = 'jpg';
  291. $this->im = imagecreatefromjpeg($this->srcImage);
  292. break;
  293. case 3:
  294. if(!function_exists("imagecreatefrompng")){
  295. $this->errorNum = 3;
  296. return false;
  297. }
  298. $this->imageType = 'png';
  299. $this->im = imagecreatefrompng($this->srcImage);
  300. break;
  301. default:
  302. $this->errorNum = 0;
  303. return false;
  304. }
  305. return true;
  306. }
  307. /**
  308. *
  309. * 用于获取上传后缩略图片的文件名
  310. * @access public
  311. * @return string
  312. */
  313. public function getNewImageName(){
  314. return $this->newImageName;
  315. }
  316.  
  317. /**
  318. *
  319. * 获取上传错误信息
  320. * @access private
  321. * @return string
  322. */
  323. private function getError(){
  324. $str='生成缩略图<font color="red">'.$this->originName.'</font>时出错:';
  325.  
  326. switch($this->errorNum){
  327. case 4: $str .= '没有找到需要缩略的图片';
  328. break;
  329. case 3: $str .= '你的GD库不能使用png格式的图片,请使用其它格式的图片!';
  330. break;
  331. case 2: $str .= '你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!';
  332. break;
  333. case 1: $str .= '你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!';
  334. break;
  335. case -1: $str .= '建立存放缩略图目录失败,请重新指定缩略图目录';
  336. break;
  337. case -2: $str .= '必须指定缩略图的路径';
  338. break;
  339. case -3: $str .= '初始化参数出错';
  340. break;
  341. default: $str .= '末知错误';
  342. }
  343.  
  344. return $str.'<br>';
  345. }
  346. public function getErrorMsg() {
  347. return $this->errorMess;
  348. }
  349.  
  350. /*
  351. * 功能:PHP图片水印 (水印支持图片或文字)
  352. * 参数:
  353. * $groundImage 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
  354. * $waterPos 水印位置,有10种状态,0为随机位置;
  355. * 1为顶端居左,2为顶端居中,3为顶端居右;
  356. * 4为中部居左,5为中部居中,6为中部居右;
  357. * 7为底端居左,8为底端居中,9为底端居右;
  358. * $waterImage 图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
  359. * $waterText 文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
  360. * $textFont 文字大小,值为1、2、3、4或5,默认为5;
  361. * $textColor 文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
  362. *
  363. * 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
  364. * $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
  365. * 当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
  366. * 加水印后的图片的文件名和 $groundImage 一样。
  367. */
  368. public function imageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000")
  369. {
  370. $isWaterImage = FALSE;
  371. $formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。";
  372.  
  373. //读取水印文件
  374. if(!empty($waterImage) && file_exists($waterImage))
  375. {
  376. $isWaterImage = TRUE;
  377. $water_info = getimagesize($waterImage);
  378. $water_w = $water_info[0];//取得水印图片的宽
  379. $water_h = $water_info[1];//取得水印图片的高
  380.  
  381. switch($water_info[2])//取得水印图片的格式
  382. {
  383. case 1:$water_im = imagecreatefromgif($waterImage);break;
  384. case 2:$water_im = imagecreatefromjpeg($waterImage);break;
  385. case 3:$water_im = imagecreatefrompng($waterImage);break;
  386. default: return false;//die($formatMsg);
  387. }
  388. }
  389.  
  390. //读取背景图片
  391. if(!empty($groundImage) && file_exists($groundImage))
  392. {
  393. $ground_info = getimagesize($groundImage);
  394. $ground_w = $ground_info[0];//取得背景图片的宽
  395. $ground_h = $ground_info[1];//取得背景图片的高
  396.  
  397. switch($ground_info[2])//取得背景图片的格式
  398. {
  399. case 1:$ground_im = imagecreatefromgif($groundImage);break;
  400. case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
  401. case 3:$ground_im = imagecreatefrompng($groundImage);break;
  402. default:return false;//die($formatMsg);
  403. }
  404. }
  405. else
  406. {
  407. return false;
  408. //die("需要加水印的图片不存在!");
  409. }
  410.  
  411. //水印位置
  412. if($isWaterImage)//图片水印
  413. {
  414. $w = $water_w;
  415. $h = $water_h;
  416. $label = "图片的";
  417. }
  418. else//文字水印
  419. {
  420. $temp = imagettfbbox(ceil($textFont*2.5),0,"./fonts/Eras_Bold_ITC.otf",$waterText);//取得使用 TrueType 字体的文本的范围
  421. $w = $temp[2] - $temp[6];
  422. $h = $temp[3] - $temp[7];
  423. unset($temp);
  424. $label = "文字区域";
  425. }
  426. if( ($ground_w<$w) || ($ground_h<$h) )
  427. {
  428. //echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!";
  429. return;
  430. }
  431. switch($waterPos)
  432. {
  433. case 0://随机
  434. $posX = rand(0,($ground_w - $w));
  435. $posY = rand(0,($ground_h - $h));
  436. break;
  437. case 1://1为顶端居左
  438. $posX = 0;
  439. $posY = 0;
  440. break;
  441. case 2://2为顶端居中
  442. $posX = ($ground_w - $w) / 2;
  443. $posY = 0;
  444. break;
  445. case 3://3为顶端居右
  446. $posX = $ground_w - $w;
  447. $posY = 0;
  448. break;
  449. case 4://4为中部居左
  450. $posX = 0;
  451. $posY = ($ground_h - $h) / 2;
  452. break;
  453. case 5://5为中部居中
  454. $posX = ($ground_w - $w) / 2;
  455. $posY = ($ground_h - $h) / 2;
  456. break;
  457. case 6://6为中部居右
  458. $posX = $ground_w - $w;
  459. $posY = ($ground_h - $h) / 2;
  460. break;
  461. case 7://7为底端居左
  462. $posX = 0;
  463. $posY = $ground_h - $h;
  464. break;
  465. case 8://8为底端居中
  466. $posX = ($ground_w - $w) / 2;
  467. $posY = $ground_h - $h;
  468. break;
  469. case 9://9为底端居右
  470. $posX = $ground_w - $w;
  471. $posY = $ground_h - $h;
  472. break;
  473. default://随机
  474. //$posX = rand(0,($ground_w - $w));
  475. //$posY = rand(0,($ground_h - $h));
  476. $posX = 5;
  477. $posY = 55;
  478. break;
  479. }
  480.  
  481. //设定图像的混色模式
  482. imagealphablending($ground_im, true);
  483.  
  484. if($isWaterImage)//图片水印
  485. {
  486. imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件
  487. }
  488. else//文字水印
  489. {
  490. if( !empty($textColor) && (strlen($textColor)==7) )
  491. {
  492. $R = hexdec(substr($textColor,1,2));
  493. $G = hexdec(substr($textColor,3,2));
  494. $B = hexdec(substr($textColor,5));
  495. }
  496. else
  497. {
  498. return false;
  499. //die("水印文字颜色格式不正确!");
  500. }
  501. imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));
  502. }
  503.  
  504. //生成水印后的图片
  505. @unlink($groundImage);
  506. switch($ground_info[2])//取得背景图片的格式
  507. {
  508. case 1:imagegif($ground_im,$groundImage);break;
  509. case 2:imagejpeg($ground_im,$groundImage);break;
  510. case 3:imagepng($ground_im,$groundImage);break;
  511. default:return false;//die($errorMsg);
  512. }
  513.  
  514. //释放内存
  515. if(isset($water_info)) unset($water_info);
  516. if(isset($water_im)) imagedestroy($water_im);
  517. unset($ground_info);
  518. imagedestroy($ground_im);
  519. }
  520.  
  521. /**
  522. * 图片大小比例调整
  523. *
  524. * @param $filename 图片路径
  525. * @param $w  目标宽度
  526. * @param $h   目标高度
  527. * @param $override 是否覆盖原文件
  528. * @param $background 是否产生背景, 如果要求产生背景则产生图像是指定的大小, 图片内容居中
  529. * @param $color 背影色
  530. */
  531. public function RatioAdjuct($filename = '', $w = 440, $h = 300, $override = null, $background = null, $color = '0xFFFFFF') {
  532. list( $imgWidth, $imgHeight ) = getImageSize ( $filename );
  533.  
  534. $ratioX = $imgWidth / $w;
  535. $ratioY = $imgHeight / $h;
  536.  
  537. if ($ratioX > $ratioY || $ratioX == $ratioY) {
  538. $dst_w = $w;
  539. $dst_h = ceil ( $imgHeight / $ratioX );
  540. } else if ($ratioY > $ratioX) {
  541. $dst_h = $h;
  542. $dst_w = ceil ( $imgWidth / $ratioY );
  543. }
  544.  
  545. //判断图片类型
  546. switch (strtolower ( strrchr ( $filename, '.' ) )) {
  547. case '.jpg' :
  548. case '.jpeg' :
  549. $im = imageCreateFromJpeg ( $filename );
  550. break;
  551. case '.gif' :
  552. $im = imageCreateFromGif ( $filename );
  553. break;
  554.  
  555. case '.png' :
  556. $im = imageCreateFromPng ( $filename );
  557. }
  558.  
  559. //是否有背景色
  560. if (null !== $background) {
  561. //将背景色转换为十进制的红绿蓝值
  562. $dec = hexdec ( $color );
  563. $red = 0xFF & ($dec >> 0x10);
  564. $green = 0xFF & ($dec >> 0x8);
  565. $blue = 0xFF & $dec;
  566.  
  567. //居中定位并复制
  568. $dst_pos = array ('d_x' => 0, 'd_y' => 0 );
  569. ($dst_w == $w) ? ($dst_pos ['d_y'] = (($h - $dst_h) / 2)) : ($dst_pos ['d_x'] = (($w - $dst_w) / 2));
  570.  
  571. $imBox = imageCreateTrueColor ( $w, $h );
  572. $color_bg = imageColorAllocate ( $imBox, $red, $green, $blue );
  573. imageFill ( $imBox, 0, 0, $color_bg );
  574. imageCopyResized ( $imBox, $im, $dst_pos ['d_x'], $dst_pos ['d_y'], 0, 0, $dst_w, $dst_h, $imgWidth, $imgHeight );
  575. } else {
  576. $imBox = imageCreateTrueColor ( $dst_w, $dst_h );
  577. imageCopyResized ( $imBox, $im, 0, 0, 0, 0, $dst_w, $dst_h, $imgWidth, $imgHeight );
  578. }
  579.  
  580. //不替换源图片
  581. if (null === $override)
  582. $filename = str_replace ( strrchr ( $filename, '.' ), '', $filename ) . '_thumb.png';
  583.  
  584. return imagejpeg ( $imBox, $filename ) ? $filename : false;
  585. }
  586. }
  587.  
  588. $th=new ThumbImages(array('imagePre'=>'xxs', 'imagePath'=>'./uploads/thumb/', 'echoType'=>'file'));
  589. $th->imageWaterMark('1034035813_x.jpg', 6, 'sy_small.png');
  590.  
  591. $th->setThumb('1034035813_x.jpg', 400, 400, 'cut');

PHP生成缩略图、加水印的更多相关文章

  1. php之图片处理类缩略图加水印

    用到两个image系统函数 imagecopymerge — 拷贝并合并图像的一部分 imagecopyresampled — 重采样拷贝部分图像并调整大小 /* 如何知道图片的大小和类型 无法确认调 ...

  2. C#如何生成缩略图、水印

    1.安装CodeCarvings.Piczard   Install-Package CodeCarvings.Piczard 2.生成缩略图 ImageProcessingJob jobThumb ...

  3. 关于生成缩略图及水印图片时出现GDI+中发生一般性错误解决方法

    System.Drawing.Image OldImage = null; oldImage = System.Drawing.Image.FromFile(ImageUrl); 使用该方法读取图片时 ...

  4. java生成缩略图,旋转,水印,截图

    转自:http://rensanning.iteye.com/blog/1545708 感谢,方便自己查看

  5. 用node.js给图片加水印

    一.准备工作: 首先,确保你本地已经安装好了node环境.然后,我们进行图像编辑操作需要用到一个Node.js的库:images.这个库的地址是:https://github.com/zhangyua ...

  6. ImageMagick实现图片加水印(ImageMagick6.9.10)

    一,ImageMagick的安装 请参见: https://www.cnblogs.com/architectforest/p/12807514.html 说明:刘宏缔的架构森林是一个专注架构的博客, ...

  7. 使用Node.js给图片加水印的方法

    一.准备工作: 首先,确保你本地已经安装好了node环境. 然后,我们进行图像编辑操作需要用到一个Node.js的库:images. 这个库的地址是:https://github.com/zhangy ...

  8. PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转

    [强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...

  9. 黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

随机推荐

  1. servlet 3.0特性说明

    Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...

  2. Windows和Linux下如何查看端口被哪个进程占用

    Windows: C:/Users/ewanbao>netstat -aon|findstr "123"  TCP    127.0.0.1:55123        0.0 ...

  3. linux 监控CPU 内存情况

    htop

  4. [Git] An efficient GIT workflow for mid/long term projects

    reference : http://fle.github.io/an-efficient-git-workflow-for-midlong-term-projects.html Our full-w ...

  5. [5] 柱台(Cylinder)图形的生成算法

    顶点数据的生成 bool YfBuildCylinderVertices ( Yreal topRadius, Yreal bottomRadius, Yreal height, Yuint slic ...

  6. 系列文章 -- OpenCV入门教程

     <OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...

  7. graphic rendering pipeline

    整理下管线 此时一定要有这张图 注意表中的数据流向 强调几个细节 之前对次序理解有点乱 rasterizer之前 管线里是只有逐顶点信息的 IA里面会setup primitive  通过Primit ...

  8. Substring with Concatenation of All Words leetcode java

    题目: You are given a string, S, and a list of words, L, that are all of the same length. Find all sta ...

  9. Java基础(十一):接口

    一.接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是 ...

  10. 【nodejs】使用response输出中文但页面中文乱码的处置

    两点要确认: 1.head里有<meta charset="utf-8"/> 2.js文件编码为utf-8格式. 第二点往往容易被忽略,所以出现乱码. 附上代码: 'u ...