OSS 圖片添加水印 image/watermark,image_


需求:對已存在於OSS對象存儲空間中的圖片添加水印;

依賴:

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;



<!-- 主要依賴就是這個,具體代碼請結合自己的開發和阿里雲OSS接口更新進度情況 -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency> 
View Code

 

簡單方式(公共讀)的水印添加:

 

/**
     * @Author qtl
     * @Description 水印路徑
     * @Date 15:29 2020/9/29
     * @Param [fileName]
     * @return java.lang.String
     **/
    public static String getWaterMarkUrl(String fileName){
        if (!StringUtils.isEmpty(fileName)) {
            FileNameMap fileNameMap = URLConnection.getFileNameMap();
            String contentTypeFor = fileNameMap.getContentTypeFor(fileName);
            String url = "";
            if (contentTypeFor != null) {// 圖片
                int index = fileName.indexOf(".");
                String str = fileName.substring(index + 1);
                String newstr = str.toLowerCase();//使用toLowerCase()方法實現小寫轉換
//                String newstr2 = str.toUpperCase();//使用toUpperCase()方法實現大寫轉換
                if(!"gif".equalsIgnoreCase(newstr)){
                    url = "https://OSS對象空間名.oss-cn-hangzhou.aliyuncs.com/文件在OSS對象存儲空間中所在目錄/" + fileName + 
"?x-oss-process=image/watermark,image_d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjA1MDc1OTE2OTIzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1,t_100,g_se,x_5,y_5";
                }else{
                    url = "https://OSS對象空間名.oss-cn-hangzhou.aliyuncs.com/文件在OSS對象存儲空間中所在目錄/" + fileName; } 
          } 
       return url; 
      }else{ 
       return ""; 
     } 
}
View Code

 

解釋:

  1. 傳入參數是文件在OSS對象存儲空間中的名稱;
  2. 判斷文件是否是圖片;
  3. 判斷是否是【gif】格式的圖片,如果是的話就不加水印了,因為阿里雲對於圖片水印的處理是獲取圖片的第一幀進行加水印的,如果是gif的圖片就會導致水印加成功了,而gif變成了靜態圖;
  4. 【url】路徑拼接規則:從【https://】到【fileName】的配置就不多說了,代碼里面有文字敘述,重點在【fileName】之后的代碼,【+ "?x-oss-process=image/watermark,image_d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjA1MDc1OTE2OTIzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1,t_100,g_se,x_5,y_5"】這段代碼就是水印的信息,主要是水印的路徑和水印在圖片中擺放的位置以及水印的大小、透明度等;
    1. 【?x-oss-process=image/watermark,image_】這段代碼是指此樣式是加水印的配置;
    2. 【d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjA1MDc1OTE2OTIzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1】這段代碼是水印圖片的路徑、水印大小等信息,這個是經過base64處理過的字符串(阿里雲官方推薦處理器網址:https://simplycalc.com/base64url-encode.php?spm=a2c4g.11186623.2.21.43eb26037IB7HM),未處理前的數據例子【文件在OSS對象存儲空間中所在路徑/水印文件全名?x-oss-process=image/resize,P_15】(P是指定水印圖片按照主圖的比例進行縮放,取值為縮放的百分比,一定要大寫)經過base64處理后就如代碼中的一串了;
    3. 【t_100,g_se,x_5,y_5】這段代碼中【t】是代表不透明度,當為100時即為不透明,【g_se】是代表水印的在圖片上的擺放方位為右下(共有9中,具體的請看下方提供的阿里雲官方文檔),【x_5,y_5】代表水印水平邊距5、中線垂直偏移5;

更多的水印處理信息獲取請查看阿里雲官方文檔: https://help.aliyun.com/document_detail/44957.html?spm=a2c4g.11186623.6.749.2e4e69danboaWz


復雜方式(私密讀)的水印添加

// 方法名什么的就不寫了,核心的代碼就是這些
  // endpoint
    private static String endpoint="https://oss-cn-hangzhou.aliyuncs.com";
    // accessKey
    private static String accessKeyId="xxx";
    private static String accessKeySecret="xxx";
    // OSS對象存儲空間名
    private static String bucketName="OSS對象空間名";
    // 文件存儲目錄
    private static String fileDir = "文件在OSS對象存儲空間中所在目錄";
    private OSSClient ossClient;

    public OSSUpload1() {
        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }
   /**
     * @Author qtl
     * @Description 水印路徑
     * @Date 15:29 2020/9/29
     * @Param [fileName]
     * @return java.lang.String
     **/
    public static String getWaterMarkUrl(String fileName){
        if (!StringUtils.isEmpty(fileName)) {
            String[] split = fileName.split("/");
            // 創建OSSClient實例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 組裝樣式代碼
            String style = "image/watermark,image_d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjAzODc0NjQxMDczLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1,t_100,P_10,g_nw,x_20,y_10";
            // 指定簽名URL過期時間為10分鍾。
            Date expiration = new Date(new Date().getTime() + 1000 * 60 * 60 * 24);
            GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, fileDir + split[split.length - 1], HttpMethod.GET);
            req.setExpiration(expiration);
            req.setProcess(style);
            URL signedUrl = ossClient.generatePresignedUrl(req);
            // 關閉OSSClient。
            ossClient.shutdown();
            return signedUrl.toString();
        }else{
            return "";
        }
    }
View Code

解釋:

  1. 創建OSS鏈接;
  2. 組裝樣式代碼,其中的難點就是【image/watermark,image_】后跟的經過base64處理后的水印圖片信息;
  3. 私密讀的數據訪問鏈接肯定是要設定訪問鏈接超時時間的;
  4. 創建OSS文件訪問鏈接,需要將分別是【endpoint:OSS對象存儲服務器所在區路徑,這個路徑可以在OSS服務器的控制台上找到】,【accessKeyId、accessKeySecret:是訪問阿里雲API 的密鑰,盡量不要使用主密鑰,創建一個 RAM 子賬號並配上訪問資源權限即可】;
  5. 將圖片樣式、超時時間追加到OSS文件訪問鏈接上,然后調用OSS連接對象即可得到正確的加過水印的圖片訪問路徑;
  6. 不要忘記關閉OSS鏈接!

 

總結(和獲取縮略圖的總結差不多):

  這兩種方式的大概區別已經在上面簡單的敘述過了,所以簡單的講一下這兩種方式的利弊:

  • 第一種方式,簡單便捷,但是因為是公共讀的權限,因此對於保密性較高的數據不太友好,但是對於保密性不高的數據很好,因為這種請求連接是固定的,也就是說一個文件的訪問鏈接在文件不移動的情況下是一直有效的,可以進行緩存;
  • 第二種,操作復雜,是私密讀的權限,安全性較高,但是無法進行緩存操作,因為數據的每次請求都需要對請求連接追加超時時間的,即使是同一個文件的請求每次也都不同,因此有緩存需求的用這種方式行不通;
  • 在加水印時一定要判斷是否是【gif】圖片(注意:第二種水印添加代碼中並未判斷是否是gif圖片);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM