nginx 透過 php 代理給圖片加水印

expectedSelf發表於2022-04-29

nginx 配置代理

location ~ /image/.*\.(gif|jpg|jpeg|png)$ {
    proxy_pass http://127.0.0.1:8888/test/watermark?url=$request_uri;
}

/img/ 匹配要代理的目錄字首,$request_uri 引數為訪問的圖片路徑。

php 水印類

/** 水印類
 * Class Watermark
 * @package app\test
 */
class Watermark
{
    /** 合成圖片水印
     * @param string $dstImage 原圖片
     * @param string $waterImg 水印圖
     */
    public static function imageMarking($dstImage, $waterImg){

        //獲取圖片資訊
        $dstInfo = getimagesize($dstImage);
        $waterInfo = getimagesize($waterImg);

        //建立影像
        $dstImgObj = self::imageCreateFrom($dstImage, $dstInfo[2]);
        $waterImgObj = self::imageCreateFrom($waterImg, $waterInfo[2]);

        //合成水印
        imagecopyresized($dstImgObj,$waterImgObj,0, 0,0,0,$dstInfo[0], $dstInfo[1],$waterInfo[0],$waterInfo[1]);

        //輸出圖片
        self::imageOut($dstImgObj,$waterInfo[2]);

        //銷燬資源物件
        imagedestroy($dstImgObj);
        imagedestroy($waterImgObj);
    }

    /** 生成圖片物件
     * @param string $imgFile 圖片路徑
     * @param string $type 圖片型別
     * @return false|\GdImage|resource
     */
    private static function imageCreateFrom($imgFile, $type) {
        switch ($type) {
            case IMAGETYPE_GIF:
                return imagecreatefromgif($imgFile);

            case IMAGETYPE_JPEG:
                return imagecreatefromjpeg($imgFile);

            case IMAGETYPE_PNG:
                return imagecreatefrompng($imgFile);
            default :   //其他格式
        }
    }

    /** 輸出圖片
     * @param string $imageObj
     * @param string $type
     */
    private static function imageOut($imageObj,$type){
        switch ($type) {
            case 1:
                header("Content-Type: image/gif");
                imagegif($imageObj);
                break;
            case 2:
                header("Content-Type: image/jpeg");
                imagejpeg($imageObj);
                break;
            case 3:
                header("Content-Type: image/png");
                imagepng($imageObj);
                break;
            default: //其他格式
        }
    }
}

呼叫示例


public function watermark(){

    //圖片路徑字首

    $image = '/data/img/' . input('url');

    self::imageMarking($image,'watermark.png');

    exit;
}

nginx水平好的,可以試著用 http_image_filter_module 模組來加水印, 我這也是無奈之舉:sweat_smile:

本作品採用《CC 協議》,轉載必須註明作者和本文連結
所幸無礙

相關文章