python写的批量图片水印工具

前段时间想给seo那边做个某工具站的爬虫,用到了图像识别(对方防守可谓严密啊,异步返回非标准json结构+referer+加密+图像四道防线.嘿嘿,代码就不放了.)

正好公司要给全站图片加水印,刚研究的图像识别又有用武之地了.

万事先谷歌,找到个加水印的代码,修改了一番就用上了.^ ^

  1 import Image,ImageFilter,ImageEnhance
  2 import os
  3 
  4 def reduce_opacity(im, opacity):
  5     """Returns an image with reduced opacity."""
  6     assert opacity >= 0 and opacity <= 1
  7     if im.mode != RGBA:
  8         im = im.convert(RGBA)
  9     else:
 10         im = im.copy()
 11     alpha = im.split()[3]
 12     alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
 13     im.putalpha(alpha)
 14     return im
 15 
 16 def watermark(im, mark, position, opacity=1):
 17     """Adds a watermark to an image."""
 18     if opacity < 1:
 19         mark = reduce_opacity(mark, opacity)
 20     if im.mode != RGBA:
 21         im = im.convert(RGBA)
 22     # create a transparent layer the size of the image and draw the
 23     # watermark in that layer.
 24     layer = Image.new(RGBA, im.size, (0,0,0,0))
 25     if position == tile:
 26         for y in range(0, im.size[1], mark.size[1]):
 27             for x in range(0, im.size[0], mark.size[0]):
 28                 layer.paste(mark, (x, y))
 29     elif position == scale:
 30         # scale, but preserve the aspect ratio
 31         ratio = min(
 32             float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])
 33         w = int(mark.size[0] * ratio)
 34         h = int(mark.size[1] * ratio)
 35         mark = mark.resize((w, h))
 36         layer.paste(mark, ((im.size[0] - w) / 2, (im.size[1] - h) / 2))
 37     else:
 38         layer.paste(mark, position)
 39     # composite the watermark with the layer
 40     return Image.composite(layer, im, layer)
 41 
 42 def fetchdir(path):
 43     """Get the source list"""
 44     return os.listdir(path)
 45 
 46 def fetchfile(path, basepath, flag):  #flag: 1 detail,2 product
 47     """Get the source images path."""
 48     if flag == 1:
 49         imageslist = os.listdir(basepath + path)
 50         del imageslist[imageslist.index(index.htm)]
 51         return imageslist
 52     elif flag == 2:
 53         imageslistraw = os.listdir(basepath + path)
 54         imageslist = []
 55         for i in imageslistraw:
 56             if not _ in i:
 57                 imageslist.append(i)
 58         return imageslist
 59 
 60 def test():
 61     basepath = /var/img_test/
 62     detail_img_root_path = basepath + upload/
 63     product_img_root_path = basepath + 2014/
 64     mark = Image.open(/var/img_test/watermark.png)
 65 
 66     #"""
 67     for d in fetchdir(detail_img_root_path):
 68         for p in fetchfile(d, detail_img_root_path, 1):
 69             impath = detail_img_root_path + d + / + p
 70             #print impath
 71             #print ‘openpic=========>>>‘ + impath
 72             try:
 73                 im = Image.open(impath)
 74                 _, im_ysize = im.size
 75                 savepath = basepath + marked/upload/
 76                 if not os.path.isdir(savepath + d):
 77                     os.makedirs(savepath + d)
 78                 markedimg = watermark(im, mark, (506, im_ysize - 67), 0.8).convert(RGB) # 3: 2:596:47 1:476*86
 79                 savepath = savepath + d + /+ p #.replace(‘jpg‘, ‘png‘)
 80                 #markedimg.show()
 81                 markedimg.save(savepath)
 82             except IOError:
 83                 print openfailed==============> + impath
 84      #"""
 85 
 86     for d1 in fetchdir(product_img_root_path):
 87         d1_path = product_img_root_path + d1
 88         for d2 in fetchdir(d1_path):
 89             d2_path = d1_path + / + d2
 90             for p in fetchfile(d2, d1_path + /, 2):
 91                 impath = d2_path + / + p
 92                 #print ‘openpic=========>>>‘ + d2_path + ‘/‘ + p
 93                 try:
 94                     im = Image.open(impath)
 95                     _, im_ysize = im.size
 96                     savepath = basepath + marked/2014/
 97                     if not os.path.isdir(savepath + d1 + / + d2):
 98                         os.makedirs(savepath + d1 + / + d2)
 99                     markedimg = watermark(im, mark, (506, im_ysize - 67), 0.8).convert(RGB)
100                     markedimg.save(savepath + d1 + / + d2 + / + p)
101                 except IOError:
102                     print openfailed==============> + impath
103 
104 if __name__ == __main__:
105     test()

 后记:之间还发现0kb图片和开发代码误传到图片路径,后代码小改变成了一个图片安全检测工具,嘿嘿.(其实就是IO异常,PIL对不能成立的图片的异常也直接继承了IO异常)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。