多くのフォーラム、画像のアップロードを行った後、ブログ、あなたがこの絵を証明することができますので、あなたの画像に透かしを追加「私のもの」かだろう「私のブログ/ウェブサイトから。」そして、それは幸いなことに、この記事では、簡単なシェアとなり、従来の方法よりも、サーバレステクノロジーの電子透かし方式を使用します。
透かしの伝統的な方法は、通常のプロセスで行われます。すなわち:
このアプローチは可能であるが、女王マップは、それが彼らのサーバリソースを引き起こす可能性がある場合、間違いなくそれは高い同時実行の場合であれば、圧力単一の要求、サーバーを増やす、または複数の人をアップロードしますが、効果は大きすぎます。
それは電子透かしプロセスに失敗した場合は、データの損失、合理的ではない、その結果、画像記憶の障害につながる可能性があります。それでは誰かが次の改善を行いました。
このアプローチの利点があることである - 我々はすぐに単一のスレッドで扱う画像を、保存することができ、タスクリストは、一つにはまた、我々は、アップロードに写真に保存されたユーザーを出してあげる保証することができ、および表示することができますが、ように、処理後に保存されていますユーザが画像を読み取る必要がある場合、透かし処理は、後で処理される、バックグラウンドで行われ、又は別々に格納し、画像によって覆われていてもよい、画像は自動的に透かしを有するように変更することができます。
前者に関しては、このアプローチは、それはもう少し複雑かもしれませんが、実際にはデータのより安定し、ストレスの少ないサーバー、動作のより制御可能一種です。しかし、このプロセス全体は、今や多くの人がテンセントクラウドに写真やその他のリソースを保存するがあり、独自のサーバー上で行う必要があるオブジェクトストレージ(COS) 、その後COS缶トリガ機能SCFとクラウドの組み合わせにより、透かしサーバはそのプロセスを所有していない達成?
本論文では、例として、テンセントのクラウド機能SCF関数テンプレート(Python言語)、簡易株式はなります。
▎実験
新機能
いいえ、クラウドサーバ機能では、テンプレート関数を選択します。
「画像」というキーワードを検索することで、画像の圧縮を選択し、設立を決定。保存した後、機能コード、コードをクリックしてください。
COSトリガー
一部の人々はCOSトリガーについてあまり知らないかもしれない、あなたはCOSトリガのスタイルに慣れるために、設定をクリックすることができます:
あなたは以下を参照してくださいすることができます:
{
"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": "上传的鉴权信息"
}
}
},
"cos":{
"cosSchemaVersion":"1.0",
"cosNotificationId":"设置的或返回的 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"
}
}
}
]
}
そこには、レコードが続く配列形式、であることに注意してください、データ構造全体を見ることができます:
"cosBucket":{ "名前": "bucketname"、 "APPID": "のAppID"、 "領域": "GZ"}
そこは、バケットによってトリガされます
"CosObject":{ "キー": "/ APPID / bucketname / DSC_0002.JPG"、 "サイズ":2598526、 "メタ":{ "Content-Typeの": "text / plainの"、「X-COS-メタテスト「:」カスタムメタ「」X-画像テスト 『:』カスタムメタ 『}、』 URL 『:』ソースステーションファイルのURLにアクセスするための「}
キーは、上記のバケットに新しいファイル名があります。
したがって、私たちは実際の状況に応じて、上記の内容は、単に(生産で、このフォーマットは、トリガーが変更に私たちを望んでいない、我々は単なるテストに変更自動的に生成されたテストに、私たちのフォーマットとして、ビットを変更することができます。
{
"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": "上传的鉴权信息"
}
}
},
"cos":{
"cosSchemaVersion":"1.0",
"cosNotificationId":"设置的或返回的 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名:mytestcos、同様のキーのように:test.png
コードの変更
そこPILと2つのパッケージについてですテンプレートのqcloud_cos_v5他の関連するパッケージは、私たちが必要とする正確に何であるので、我々は、機能プロセスを梱包保存することができますので、既存のテンプレートを使用する理由はあるだけの簡単な修正を必要としますこれを達成することができます。
ウォーターマークを追加します。
def add_word(pic_path, save_path):
# 打开图片
im = Image.open(pic_path).convert('RGBA')
# 新建一个空白图片,尺寸与打开图片一样
txt = Image.new('RGBA', im.size, (0, 0, 0, 0))
# 设置字体
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)
ウォーターマークを追加し、我々は、テキストの透かしを設定、フォントやフォントサイズを設定する必要があります。
fnt = ImageFont.truetype("/tmp/font.ttf",40)
この時点で、我々は最初に/ tmp /フォルダにフォントファイルに渡された、前に実行する必要があります。
response = client.get_object(Bucket="mytestcos-12567****", Key="font.ttf", ) response['Body'].get_stream_to_file('/tmp/font.ttf')
私の例ではコス:
そして、次のステップでは、ローカルおよび透かしなどに、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)
ここで説明するのは、なぜ2つのバケットがありますか?
私たちは、「ツール」トリガーSCF機能としてバケツをしたいので、我々は再び結果を裏書きする場合は、追加の処理および判断せずに、バケツを透かし、そして絵意志再びこの透かし透かしアンチ後ので、ここで繰り返し発生する深刻な循環が、2つのバケットを作成している、あなたは難易度を減らすことができ、それはまた、パフォーマンスを保護し、生まれたBUGを減らすことができます。
完全なコードは次のとおりです。
# -*- coding: utf-8 -*-
from PIL import Image, ImageFont, ImageDraw
from qcloud_cos_v5 import CosConfig
from qcloud_cos_v5 import CosS3Client
from qcloud_cos_v5 import CosServiceError
from qcloud_cos_v5 import CosClientError
appid = ** # 请替换为您的 APPID
secret_id = ***' # 请替换为您的 SecretId
secret_key = **' # 请替换为您的 SecretKey
region = u'ap-chengdu' # 请替换为您bucket 所在的地域
token = ''
to_bucket = 'tobucket-12567***' # 请替换为您用于存放压缩后图片的bucket
config = 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))
# 设置字体
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)
APPID、secret_id、secret_keyに、to_bucket:いくつかのパラメータがあることに留意すべきです
次のようにこれらのパラメータのソースは以下のとおりです。
そして、秘密識別情報Secret、あなたが必要とする秘密鍵はここにあります:
テスト
私はこのバケットに絵のテストをアップロードしている前に、名前は次のとおりです。test.png
このような画像:
その後、我々はこのテストを実行します。
その後、私たちが行くと私たちの目標バケットを見ることができる、それが正常にテストされた、見ることができます。
私たちは、画像を生成し、成功を見ることができます:
あなたは私たちが追加した画像の右下に、透かしコードを見ることができます:
これまでのところ、我々はあなたのウェブサイトの画像のためのクラウドを通じて透かし機能のSCFを追加する基本的なプロセスを完了しました。
追加▎言います
実際には、この記事では、我々は、このプロセスによってのみ圧縮画像は、透かしも画像上で他の操作を行うことができます追加することはできません、開始考えることができます。例えば、画像処理や、いくつかの深い処理を定型化し、すべてのこのプロセスは、そのサーバーのリソースを占有しませんが、SCF機能の雲によって行われます。
でも高い同時実行の顔場合は、アップロードする写真がたくさんある、私たちは何をする必要がある唯一のSDKを通じて、絵がCOSでテンセントクラウドオブジェクトストアに渡されます。
ポータル:
- GitHubの:github.com/serverless
- 公式サイト:serverless.com
ようこそ:サーバレスの中国ネットワーク、することができますベストプラクティスにサーバレスで複数のアプリケーションを開発するための経験!