国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 「實踐」如何優(yōu)雅地給網(wǎng)站圖片加水印

「實踐」如何優(yōu)雅地給網(wǎng)站圖片加水印

時間:2023-07-03 16:45:02 | 來源:網(wǎng)站運營

時間:2023-07-03 16:45:02 來源:網(wǎng)站運營

「實踐」如何優(yōu)雅地給網(wǎng)站圖片加水?。?blockquote data-first-child data-pid="cejFFIXH">很多論壇、博客在進行圖片上傳之后,都會給自己的圖像加上水印,這樣可以證明這張圖片「屬于我」或者是「來自我的博客/網(wǎng)站」。那么使用 Serverless 技術(shù)來加水印的方法比傳統(tǒng)方法好在哪兒呢,本文將對此進行一個簡單的分享。傳統(tǒng)的加水印的方法,通常是在流程內(nèi)進行。即:

這種做法雖然可行,但是無疑會增加單次請求,服務(wù)端的壓力,如果是高并發(fā)的情況下,或者多人上傳多張大圖的時候,那么可能就會造成自身服務(wù)器資源效果過大。

如果在加水印過程中失敗,就有可能導(dǎo)致圖像存儲失敗,致使數(shù)據(jù)丟失,并不理智。所以后來有人做了如下改進:

這樣做法的好處就是 —— 我們可以快速將圖片存儲,存儲之后通過一個單獨處理的線程,對任務(wù)列表進行處理,這樣一方面是可以保證我們馬上把用戶上傳的圖片存儲,并且可以顯示,同時也可以在后臺進行水印處理,待處理之后,再將圖片覆蓋或者單獨存儲,用戶如果需要讀取圖片時,可以自動變?yōu)橐呀?jīng)水印后的圖片。

這種做法相對于前者來說可能稍微復(fù)雜一些,但是實際上卻是在數(shù)據(jù)上更加穩(wěn)定,服務(wù)端壓力更小,更加可控的一種操作。但是,這整個流程還是要在自己的服務(wù)器上做完,現(xiàn)在已經(jīng)有很多人將圖片等資源存儲到騰訊云的對象存儲(COS)中,那么可不可以通過某些 COS 觸發(fā)器與云函數(shù) SCF 結(jié)合,實現(xiàn)一個不在自己服務(wù)器加水印的流程呢?

本文將以騰訊云函數(shù) SCF 的函數(shù)模板(Python 語言)為例,進行一個簡單的分享。

實驗

新建函數(shù)

在無服務(wù)器云函數(shù)中,選擇模板函數(shù):

通過搜索「圖像」關(guān)鍵詞,選中圖像壓縮,并且確定建立。保存之后,點擊函數(shù)代碼,進行代碼編寫。

COS 觸發(fā)器

有些人可能對 COS 觸發(fā)器還不是很了解,此時可以點擊配置,來熟悉 COS 觸發(fā)器樣式:

可以看到如下:

{ "Records":[ { "event": { "eventVersion":"1.0", "eventSource":"qcs::cos", "eventName":"cos: ObjectCreated: *", "eventTime":1501054710, "eventQueue":"qcs:0:cos:gz:1251111111:cos", "requestParameters":{ "requestSourceIP": "111.111.111.111", "requestHeaders":{ "Authorization": "上傳的鑒權(quán)信息" } } }, "cos":{ "cosSchemaVersion":"1.0", "cosNotificationId":"設(shè)置的或返回的 ID", "cosBucket":{ "name":"bucketname", "appid":"appId", "region":"gz" }, "cosObject":{ "key":"/appid/bucketname/DSC_0002.JPG", "size":2598526, "meta":{ "Content-Type": "text/plain", "x-cos-meta-test": "自定義的 meta", "x-image-test": "自定義的 meta" }, "url": "訪問文件的源站url" } } } ]}這里面可以看到整個一個數(shù)據(jù)結(jié)構(gòu),需要注意 Records 是一個數(shù)組格式,其次就是:

"cosBucket":{"name":"bucketname","appid":"appId","region":"gz"}

這里面是由該 bucket 觸發(fā)

"cosObject":{"key":"/appid/bucketname/DSC_0002.JPG","size":2598526,"meta":{"Content-Type":"text/plain","x-cos-meta-test":"自定義的 meta","x-image-test":"自定義的 meta"},"url":"訪問文件的源站 url"}

這里面的 key 是在上述 bucket 中新建的文件名字。

所以,我們可以按照我們的實際情況,將上面的內(nèi)容簡單修改一下,成為我們格式,以便測試(在生產(chǎn)中,這個是自動生成的觸發(fā)格式,并不需要我們修改,我們修改只是為了測試)

{ "Records":[ { "event": { "eventVersion":"1.0", "eventSource":"qcs::cos", "eventName":"cos: ObjectCreated: *", "eventTime":1501054710, "eventQueue":"qcs:0:cos:gz:1251111111:cos", "requestParameters":{ "requestSourceIP": "111.111.111.111", "requestHeaders":{ "Authorization": "上傳的鑒權(quán)信息" } } }, "cos":{ "cosSchemaVersion":"1.0", "cosNotificationId":"設(shè)置的或返回的 ID", "cosBucket":{ "name":"mytestcos", "appid":"appId", "region":"gz" }, "cosObject":{ "key":"test.png", "size":2598526, "meta":{ "Content-Type": "text/plain", "x-cos-meta-test": "自定義的 meta", "x-image-test": "自定義的 meta" }, "url": "訪問文件的源站url" } } } ]}這里主要修改了我的 cosBucket-name:mytestcos,以及 key:test.png

代碼修改

之所以使用現(xiàn)有的模板,是因為該模板的有 PIL 和 qcloud_cos_v5 等相關(guān) package,而這兩個 package 正是我們即將需要的,這樣就可以省去我們打包函數(shù)的流程,只需要進行簡單修改即可實現(xiàn)。

添加水?。?br>
def add_word(pic_path, save_path): # 打開圖片 im = Image.open(pic_path).convert('RGBA') # 新建一個空白圖片,尺寸與打開圖片一樣 txt = Image.new('RGBA', im.size, (0, 0, 0, 0)) # 設(shè)置字體 fnt = ImageFont.truetype("/tmp/font.ttf", 40) # 操作新建的空白圖片>>將新建的圖片添入畫板 d = ImageDraw.Draw(txt) # 在新建的圖片上添加字體 d.text((txt.size[0] - 220, txt.size[1] - 80), "By Dfounder", font=fnt, fill=(255, 255, 255, 255)) # 合并兩個圖片 out = Image.alpha_composite(im, txt) # 保存圖像 out.save(save_path)在添加水印的時候,我們設(shè)置的是文字水印,所以需要設(shè)置字體和字號:

fnt = ImageFont.truetype("/tmp/font.ttf",40)此時,我們需要在執(zhí)行之前,先將字體文件傳入到 /tmp/ 文件夾下:

response = client.get_object(Bucket="mytestcos-12567****", Key="font.ttf", )response['Body'].get_stream_to_file('/tmp/font.ttf')以我的 cos 為例:

然后,接下來就是對觸發(fā)的 event 進行解析,包括獲得新建的圖像名稱,從 COS 拉取,放到本地,然后進行水印等,再上傳回新的 COS 中:

for record in event['Records']: try: bucket = record['cos']['cosBucket']['name'] + '-' + str(appid) key = record['cos']['cosObject']['key'] key = key.replace('/' + str(appid) + '/' + record['cos']['cosBucket']['name'] + '/', '', 1) download_path = '/tmp/{}'.format(key) upload_path = '/tmp/new_pic-{}'.format(key) # 下載圖片 try: response = client.get_object(Bucket=bucket, Key=key, ) response['Body'].get_stream_to_file(download_path) except CosServiceError as e: print(e.get_error_code()) print(e.get_error_msg()) print(e.get_resource_location()) # 圖像增加水印 add_word(download_path, upload_path) # 圖像上傳 response = client.put_object_from_local_file( Bucket=to_bucket, LocalFilePath=upload_path.decode('utf-8'), Key=("upload-" + key).decode('utf-8') ) except Exception as e: print(e)此處說明一下,為什么要有兩個存儲桶?

因為我們要把一個存儲桶作為觸發(fā) SCF 函數(shù)的「工具」,如果我們將水印結(jié)果再次寫回這個存儲桶,在不進行額外判斷和處理的前提下,那么這個水印后的圖片會再次水印,反反復(fù)復(fù)造成惡劣的循環(huán),所以此處建立兩個存儲桶,可以降低難度,也可以保護性能,減少 BUG 誕生。

完整代碼如下:

# -*- coding: utf-8 -*-from PIL import Image, ImageFont, ImageDrawfrom qcloud_cos_v5 import CosConfigfrom qcloud_cos_v5 import CosS3Clientfrom qcloud_cos_v5 import CosServiceErrorfrom qcloud_cos_v5 import CosClientErrorappid = ** # 請?zhí)鎿Q為您的 APPIDsecret_id = ***' # 請?zhí)鎿Q為您的 SecretIdsecret_key = **' # 請?zhí)鎿Q為您的 SecretKeyregion = u'ap-chengdu' # 請?zhí)鎿Q為您bucket 所在的地域token = ''to_bucket = 'tobucket-12567***' # 請?zhí)鎿Q為您用于存放壓縮后圖片的bucketconfig = CosConfig(Secret_id=secret_id, Secret_key=secret_key, Region=region, Token=token)client = CosS3Client(config)response = client.get_object(Bucket="mytestcos-12567***", Key="font.ttf", )response['Body'].get_stream_to_file('/tmp/font.ttf')def add_word(pic_path, save_path): # 打開圖片 im = Image.open(pic_path).convert('RGBA') # 新建一個空白圖片,尺寸與打開圖片一樣 txt = Image.new('RGBA', im.size, (0, 0, 0, 0)) # 設(shè)置字體 fnt = ImageFont.truetype("/tmp/font.ttf", 40) # 操作新建的空白圖片>>將新建的圖片添入畫板 d = ImageDraw.Draw(txt) # 在新建的圖片上添加字體 d.text((txt.size[0] - 220, txt.size[1] - 80), "By Dfounder", font=fnt, fill=(255, 255, 255, 255)) # 合并兩個圖片 out = Image.alpha_composite(im, txt) # 保存圖像 out.save(save_path)def main_handler(event, context): for record in event['Records']: try: bucket = record['cos']['cosBucket']['name'] + '-' + str(appid) key = record['cos']['cosObject']['key'] key = key.replace('/' + str(appid) + '/' + record['cos']['cosBucket']['name'] + '/', '', 1) download_path = '/tmp/{}'.format(key) upload_path = '/tmp/new_pic-{}'.format(key) # 下載圖片 try: response = client.get_object(Bucket=bucket, Key=key, ) response['Body'].get_stream_to_file(download_path) except CosServiceError as e: print(e.get_error_code()) print(e.get_error_msg()) print(e.get_resource_location()) # 圖像增加水印 add_word(download_path, upload_path) # 圖像上傳 response = client.put_object_from_local_file( Bucket=to_bucket, LocalFilePath=upload_path.decode('utf-8'), Key=("upload-" + key).decode('utf-8') ) except Exception as e: print(e)這里面需要注意這幾個參數(shù):appid、secret_id、secret_key、to_bucket

這幾個參數(shù)的來源如下:

而 secretid,secretkey 則需要在這里獲?。?br>

測試

之前我已經(jīng)上傳了一個測試圖片在這個 bucket 中,名字是:test.png

圖片是這樣子:

然后我們進行一下測試:

可以看到,已經(jīng)測試成功,接下來我們可以去我們的目標 bucket 中看看:

可以看到成功生成了一個圖片:

可以看到圖片的右下角,有我們代碼中添加的水?。?br>
至此,我們完成了通過云函數(shù) SCF 為您的網(wǎng)站圖片添加水印的基本流程。

額外想說的

其實,這篇文章也算是拋磚引玉,大家不僅可以通過這個流程壓縮圖像、添加水印,甚至還可以對圖像進行其他操作。例如圖像風(fēng)格化處理等一些深加工,而這一切過程,都不會占用自身服務(wù)器資源,而是通過云函數(shù) SCF 來完成的。

即使面對高并發(fā),有大量的圖片上傳時,我們要做的也僅僅是通過 SDK,將圖片傳入到 COS 中。


作者介紹:騰訊云高級研發(fā)工程師劉宇
推薦閱讀:
GitHub:
歡迎關(guān)注:騰訊云 Serverless 團隊

我們專注于 Serverless 架構(gòu)的最佳實踐!

關(guān)鍵詞:圖片,水印,實踐

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉