1<?php 2class Mosaic { 3 public function run() { 4 $filename = './image.jpg'; // 要被打马赛克的图片路径 5 $saveFileName = './image_mosaic.jpg';// 打上马赛克后的保存名 6 $x = 200; // 起始位置的x 7 $y = 20; // 起始位置的y 8 $width = 100; // 马赛克区域的宽度 9 $height = 30; // 马赛克区域的高度 10 list($src_w) = getimagesize($filename); // 原图片的宽度 11 $image = imagecreatefromjpeg($filename); 12 $deep = $this->getDeep($src_w); 13 for ($i = 0; $i < $width; $i += $deep) { 14 for ($j = 0; $j < $height; $j += $deep) { 15 $calcX = $x + $i; 16 $calcY = $y + $j; 17 $color = imagecolorat($image, $calcX + round($deep / 2), $calcY + round($deep / 2)); 18 $rgb = $this->getColor($color); 19 $col = imagecolorallocatealpha($image, $rgb['r'], $rgb['g'], $rgb['b'], 0); 20 imagefilledrectangle($image, $calcX, $calcY, $calcX + $deep, $calcY + $deep, $col); 21 } 22 } 23 imagejpeg($image, $saveFileName); 24 imagedestroy($image); 25 } 26 27 /** 28 * 获取颜色RGBA 29 * 30 * @param int $rgb 颜色值 31 * 32 * @return array 33 */ 34 protected function getColor(int $rgb) { 35 $rColorNum = $gColorNum = $bColorNum = $total = 0; 36 //三通道 37 $r = ($rgb >> 16) & 0xFF; 38 $g = ($rgb >> 8) & 0xFF; 39 $b = $rgb & 0xFF; 40 $rColorNum += $r; 41 $gColorNum += $g; 42 $bColorNum += $b; 43 $total++; 44 $rgb = []; 45 $rgb['r'] = round($rColorNum / $total); 46 $rgb['g'] = round($gColorNum / $total); 47 $rgb['b'] = round($bColorNum / $total); 48 // 替换比较黑的颜色值,让比较黑的颜色变淡 49 $cover = 104; // 替换为#686868 50 foreach ($rgb as $key => &$value) { 51 if ($value < $cover) { 52 $value = $cover; 53 } 54 } 55 56 return $rgb; 57 } 58 59 /** 60 * 根据图片长度计算马赛克框大小 61 * 62 * @param int $width 图片的长度 63 * 64 * @return int 65 */ 66 protected function getDeep(int $width) { 67 switch (true) { 68 case $width >= 3000 : 69 return 30; 70 case $width >= 2000 : 71 return 20; 72 case $width >= 1000 : 73 return 10; 74 case $width >= 100 : 75 return 5; 76 } 77 } 78} 79$mosaic = new Mosaic(); 80$mosaic->run();
PHP轮子之图片局部马赛克
Wesley13
2021-10-11
1504 0 0
点赞
收藏
评论区
加载中...