PHP給圖片視訊新增水印
阿新 • • 發佈:2021-02-19
一、為圖片新增水印
function imageWaterMark($groundImage, $waterPos = 0, $waterImage = "") { $isWaterImage = FALSE; $formatMsg = "暫不支援該檔案格式,請用圖片處理軟體將圖片轉換為GIF、JPG、PNG格式。"; //讀取水印檔案 if (!empty($waterImage) && file_exists($waterImage)) { $isWaterImage = TRUE; $water_info = getimagesize($waterImage); $water_w = $water_info[0]; //取得水印圖片的寬 $water_h = $water_info[1]; //取得水印圖片的高 switch ($water_info[2]) {//取得水印圖片的格式 case 1:$water_im = imagecreatefromgif($waterImage); break; case 2:$water_im = imagecreatefromjpeg($waterImage); break; case 3:$water_im = imagecreatefrompng($waterImage); break; default:die($formatMsg); } } //讀取背景圖片 if (!empty($groundImage) && file_exists($groundImage)) { $ground_info = getimagesize($groundImage); $ground_w = $ground_info[0]; //取得背景圖片的寬 $ground_h = $ground_info[1]; //取得背景圖片的高 switch ($ground_info[2]) {//取得背景圖片的格式 case 1:$ground_im = imagecreatefromgif($groundImage); break; case 2:$ground_im = imagecreatefromjpeg($groundImage); break; case 3:$ground_im = imagecreatefrompng($groundImage); break; default:die($formatMsg); } } else { die("需要加水印的圖片不存在!"); } //水印位置 if ($isWaterImage) {//圖片水印 $w = $water_w; $h = $water_h; } //等比縮放水印 $gd_width=$ground_w/5.12;//設定的寬度 if($w>$gd_width){ $heitht_dy=($gd_width*$h)/$w; $width_dy=$gd_width; }else{ $heitht_dy=$h; $width_dy=$w; } $new_sl=imagecreatetruecolor($width_dy,$heitht_dy);//新建真彩圖像,用於製作縮圖 imagecopyresampled($new_sl,$water_im,0,0,0,0,$width_dy,$heitht_dy,$w,$h);//影象剪下函式 switch ($waterPos) { case 0://隨機 $posX = rand(0, ($ground_w - $w)); $posY = rand(0, ($ground_h - $h)); break; case 1://1為頂端居左 $posX = 0; $posY = 0; break; case 2://2為頂端居中 $posX = ($ground_w - $w) / 2; $posY = 0; break; case 3://3為頂端居右 $posX = $ground_w - $w; $posY = 0; break; case 4://4為中部居左 $posX = 0; $posY = ($ground_h - $h) / 2; break; case 5://5為中部居中 $posX = ($ground_w - $w) / 2; $posY = ($ground_h - $h) / 2; break; case 6://6為中部居右 $posX = $ground_w - $w; $posY = ($ground_h - $h) / 2; break; case 7://7為底端居左 $posX = 0; $posY = $ground_h - $h; break; case 8://8為底端居中 $posX = ($ground_w - $w) / 2; $posY = $ground_h - $h; break; case 9://9為底端居右 //$posX = $ground_w - $w - 10; // -10 是距離右側10px 可以自己調節 $posX = $ground_w - $width_dy - 5; //$posY = $ground_h - $h - 10; // -10 是距離底部10px 可以自己調節 $posY = $ground_h - $heitht_dy - 5; break; default://隨機 $posX = rand(0, ($ground_w - $w)); $posY = rand(0, ($ground_h - $h)); break; } //設定影象的混色模式 imagealphablending($ground_im, true); if ($isWaterImage) {//圖片水印 //imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h); //拷貝水印到目標檔案 imagecopy($ground_im, $new_sl, $posX, $posY, 0, 0, $width_dy, $heitht_dy); //拷貝水印到目標檔案 } //生成水印後的圖片 @unlink($groundImage); switch ($ground_info[2]) {//取得背景圖片的格式 case 1:imagegif($ground_im, $groundImage); break; case 2:imagejpeg($ground_im, $groundImage); break; case 3:imagepng($ground_im, $groundImage); break; default:die("系統錯誤"); } //釋放記憶體 if (isset($water_info)) unset($water_info); if (isset($water_im)) imagedestroy($water_im); unset($ground_info); imagedestroy($ground_im); }
imageWaterMark('404.jpg',9,'logo.gif');//背景圖片,$waterPos水印位置,水印圖片地址
參考文章:https://www.sucaihuo.com/php/265.html
業務要求是在富文字中提取出圖片並新增水印,這裡把提取富文字圖片的程式碼也貼出來,記錄下
/** * 獲取富文字編譯器中的所有圖片 * @param string $contentStr * @return array */ function getPatternMatchImages($contentStr = '') { $img_src_arr = []; $pattern_imgTag = '/<img\b.*?(?:\>|\/>)/i'; preg_match_all($pattern_imgTag,$contentStr,$match_img); if (isset($match_img[0])) { foreach ($match_img[0] as $key => $img_tag) { $pattern_src = '/\bsrc\b\s*=\s*[\'\"]?([^\'\"]*)[\'\"]?/i'; preg_match_all($pattern_src,$img_tag,$matchSrc); if (isset($matchSrc[1])) { foreach ($matchSrc[1] as $src) { $img_src_arr[] = $src; } } } } //print_r($img_src_arr); }
二、為視訊新增水印
這裡採用的是:服務安裝ffmpeg,php通過函式exec函式執行新增視訊水印的方式
centos安裝ffmpeg參考該篇文章
//由於加水印需要一定的時間,故採用後臺執行命令的方式 > /dev/null 2>&1 & //$groundVideo 需要加水印的視訊地址 //$waterVideo 水印地址 //$newGroundVideo 加水印後生成的視訊地址 $cmd = 'ffmpeg -i '.$groundVideo.' -i '.$waterVideo.' -filter_complex "[1:v]scale=100:100[s];[0:v][s]overlay=main_w-overlay_w-10:10" '.$newGroundVideo.' > /dev/null 2>&1 & '; exec($cmd);
如程式碼執行報錯,考慮三個原因1、PHP 禁用函式中需取消掉exec等函式 2、視訊檔案地址許可權問題 3、執行該程式的使用者沒有執行命令的許可權