どのように自分の写真に透かしを作ります

18495 ワード

変換元:http://blog.csdn.net/marksinoberg.//blog.csdn.net/Marksinoberg/article/details/53363533
ディレクトリ(?)[+]
誘因げんり
画像透かし文字透かし
フルコード使用方法
helpコマンド1枚の画像透かし1枚の文字透かし一括画像透かし一括文字透かし
注意と拡張
に注意
コーディング問題文字透かしアダプティブ
開拓
まとめ
今日は自分で作ったユーティリティを共有します.それは画像に透かしを追加することです.最大の特徴は文字透かし(漢字、英語)をサポートし、画像透かしもサポートすることです.1枚の画像に透かしを付けることもできますし、ロットの画像に透かしを加えることもできます.
誘因
本人は普段からブログなどを書くのが好きなので、マップを使うことは避けられませんが、現在(2016年11月27日)ではCSDNに自分の画像に自動的に透かしを付けることはできません.だから、ブログを自分のサイトのブログとして登録するサイトに乗る機会を提供しました.
例えば、CSDNでのオリジナルは、他の人にトップを占められています.  如何给自己的照片制作水印_第1张图片
自分の文章の質はともかく、良し悪しにかかわらず、自分のアルファベットを1文字ずつ叩いたので、多少苦労しました.しかし、他の人に声明を出さずに行かれたのは、少し恨みを抱かせた.さらに、自分たちのサイトの透かしを付けて「オリジナルになった」ということも・・・
そこで、自分に説明するために.小道具を書くことにしました.自分で自分の画像に透かしをつけて、自分で自分を守りましょう.
げんり
画像透かし
画像透かしについては、1枚の画像を別の画像に貼り付けることが理解できます.これはコードを使って実現されたにすぎない.
文字透かし
文字透かしが少し違います.しかし、原理的にはそれほど悪くない.それは、まずPILを使って背景図を生成し、その画像にいくつかの文字を置くことです(漢字には追加の処理が必要です).最後に,画像透かしの原理を用いて,この生成した画像を透かしとして別の画像に追加する.
完全なコード
以下に完全なコードを貼って、必要なものがあれば自分で取ってください.
# coding:utf-8
import sys

reload(sys)
sys.setdefaultencoding('utf8')
#    __author__ = '   '
#    __date__ = '2016/11/26'
#    __Desc__ =   ,         ,         ,\
#          (          ,       ,     ,         )

#   PIL    
from PIL import Image, ImageFont, ImageDraw
#          
import os
#        
import argparse

#                ,         
def picmark(tomarkpath, markpath):
    image = Image.open(tomarkpath)
    mark = Image.open(markpath)
    layer = Image.new("RGBA", image.size, (0, 0, 0, 0))
    x, y = image.size[0]-mark.size[0]-12, image.size[1]-mark.size[1]-10
    layer.paste(mark, (x, y))
    out = Image.composite(layer, image, layer)
    out.save(tomarkpath)
    print "{} has beed added the watermark successfully :)".format(tomarkpath)

#         ,    。
def textgenerate(text='http://blog.csdn.net
CSDN '
, textcolor=(0, 0, 0), bgcolor=(255, 255, 255))
:
# After test, those parameters is suitful for Chinese watermark. size = len(text) * 12, len(text) * 2 fontsize = len(text) / 2 if len(text)/2 > 20 else 24 font = ImageFont.truetype('simsun.ttc', fontsize) image = Image.new('RGB', size, bgcolor) draw = ImageDraw.Draw(image) draw.text((size[0] / 7, size[1] / 5), u'{}'.format(text), textcolor, font=font) # image.save(r'./asdsadsadsasa.png') return image # , , , 。 def textmark(tomarkpath, markimage): image = Image.open(tomarkpath) layer = Image.new("RGBA", image.size, (0, 0, 0, 0)) x, y = image.size[0] - markimage.size[0] - 12, image.size[1] - markimage.size[1] - 10 layer.paste(markimage, (x, y)) out = Image.composite(layer, image, layer) out.save(tomarkpath) print "{} has beed added the watermark successfully :)".format(tomarkpath) # , png,jpg, jpeg, gif 。 。 def getallpics(dirpath): pics = [] files = os.listdir(dirpath) for filename in files: if str(filename).endswith('jpeg') or str(filename).endswith('png') or str(filename).endswith('jpg') or str(filename).endswith('gif'): pics.append(filename) else: continue return pics # , def runbatchlywithmark(markpath, dirpath): tomarkfiles = getallpics(dirpath=dirpath) watermarkname = markpath.split('/')[-1] tomarkfiles.remove(watermarkname) # print tomarkfiles for item in tomarkfiles: picmark(item, markpath) print "All done!" # , 。 def runbatchlywithtext(dirpath, text, textcolor=(85, 123, 205), bgcolor=(0,0,0)): tomarkfiles = getallpics(dirpath=dirpath) # print tomarkfiles markimage = textgenerate(text=text, textcolor=textcolor, bgcolor=bgcolor) for item in tomarkfiles: textmark(item, markimage) print "All done!" # , if __name__ == '__main__': # parser = argparse.ArgumentParser(description='Add watermark to your pictures batchly and singly!
You can also assign the text color or background color.
'
) parser.add_argument('-t', '--text', type=str, default='CSDN ', help='the text you want to attach to the picture!') parser.add_argument('-tc', '--textcolor', type=str, default=(85, 123, 205), help='the text color you want!
Both style like (85, 123, 205) and #XXXXXX can be all right'
) parser.add_argument('-bgc', '--bgcolor', type=str, default=(32, 234, 105), help='the background color you want!
Both style like (32, 234, 105) and #XXXXXX can be all right'
) parser.add_argument('-dp', '--dirpath', type=str, default=r'./', help='the directory contains pictures you want to attach watermark.
Default directory is current directory.'
) parser.add_argument('-mp', '--markpath', type=str, help='the watermark picture you prepared already!
Generally it\'s smaller than raw pictures.'
) parser.add_argument('-spp', '--singlepicpath', type=str, help='the single picture path you want to add watermark.') args = parser.parse_args() # Because of the codec in cmd on windows, utf-8 should be use carefully when attach Chinese text as watermark. text = args.text.decode('gbk').encode('utf-8') textcolor = args.textcolor bgcolor = args.bgcolor dirpath = args.dirpath markpath = args.markpath singlepicpath = args.singlepicpath # for single picture attaching watermark. if singlepicpath: # attach text or using mark picture prepared if markpath: picmark(tomarkpath=singlepicpath, markpath=markpath) else: markimage = textgenerate(text=text, textcolor=textcolor, bgcolor=bgcolor) textmark(tomarkpath=singlepicpath, markimage=markimage) else: # attach text or using mark picture prepared if markpath: runbatchlywithmark(markpath=markpath, dirpath=dirpath) else: runbatchlywithtext(dirpath=dirpath, text=text, textcolor=textcolor, bgcolor=bgcolor)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119

  • 使用方法
    argparseを使用しているので、コマンドラインパラメータの使用を容易に行うことができます.何かわからないことがあったら、helpコマンドをそのまま使えばいいです.詳細な使用方法で出力されます.
    helpコマンド
    如何给自己的照片制作水印_第2张图片
    1枚の画像透かし
    画像透かしを追加するには、事前に効果図を用意する必要があります.例えば、ブログ主は280 X 52ピクセルサイズの素材を用意しています.  水印素材
    では、プレゼンテーションの便宜上、透かしをする画像を探さなければなりません.次の写真を使ってみてください.  如何给自己的照片制作水印_第3张图片
    では本番ですね.  如何给自己的照片制作水印_第4张图片
    文字透かし
    さて、やはりその画像ですが、今回は文字透かしを試してみます.-t-tc、-bgcなどのオプションを指定できます.デフォルト値を使うこともできますが、デフォルト値はブロガー自身の情報ですが(^^)ヒヒ・・・
    如何给自己的照片制作水印_第5张图片
    一括画像透かし
    バッチは、指定されたディレクトリの下にあるすべての透かしを行う画像に透かしを追加しただけです.  如何给自己的照片制作水印_第6张图片
    その後、テストフォルダの下には、すべての画像(透かし画像自体を除く)に画像透かしが追加されていることが表示されます.  如何给自己的照片制作水印_第7张图片
    一括文字透かし
    同様に、文字透かしの一括追加について説明します.  如何给自己的照片制作水印_第8张图片
    画像の右下に緑の表示がはっきりしていると思います.
    注意と拡張
    さあ、感動的な項目を話しました.このツールに存在する問題についてお話ししましょう.
    に注意
    コーディングの問題
    まず注意しなければならないのは、相変わらずPythonの符号化の問題だ.デフォルトのPythonスクリプトファイルはUTF-8で符号化され、WindowsのCMDコマンド動作はGBKで符号化されるため、漢字を入力するとPythonインタプリタがエラーを報告します.解決策は現在、ハードコーディング方式を採用している.
    text = args.text.decode(‘gbk’).encode(‘utf-8’)
    ソースコードには、CMDに入力した漢字をUTF-8コードに変換し、Pythonインタプリタを正しく動作させるコマンドがあります.
    しかし、あなたの環境がLinuxであれば、このように書くことはできません.そうでないと復号異常の問題が報告されます.したがって、自分の環境のエンコード情報を自分で確認し、スクリプトをハードコーディングする必要があります.
    もしかすると、この时に多くの不服な友达がPython 3を吹聴するのがどんなに良いか、実は私も反対しませんが、个人的にはこれを言って、何の意味もありません.言語はツールで、すべての人はすべて自分の好みがあって、誰もあなたの意志に従って仕事をしなければならなくて、自分をよく管理すればいいです.余談だ,余計なことは言わない.
    文字透かしの適応
    スクリプトでは文字透かしに少し適応した処理を行いました.しかし、まだ十分ではありません.必要があれば自分で指定できます.
    また,文字透かしフォントサイズも同様に扱うことができる.
    広がる
    上記の問題に対して最適化を行う以外にも、比較的大きく、実現しやすい方向があると思います.それが透かし位置です.スクリプトでは、ブロガー自身のニーズに合わせて手動で画像の右下隅に指定します.この点はあまり普遍的ではない.したがって,透かしができると思われる追加を実現するために,スクリプトをさらに拡張することができる.
    まとめ
    振り返ってみると、主にブロガーがなぜこのようなツールを作ったのか、一歩一歩の実現、使い方、その後の開拓などを紹介しています.