Tif图片加水印核心代码+gevent处理大图片同步切换的时候内存不足的解决办法

在多任务处理几百兆一张图片加水印的时候,出现了内存不足的情况,针对以上情况的主要影响因素有以下几种:

1.内存不足
2.Python可用内存不足
3.减少任务并发数量
4.可能的话压缩图片

#加水印核心代码
def image_addwatermarker(infilepath, outfilepath, scene_text):
    #scene_text为加了文字的图片句柄
    #source_img.crop为tif加水印的核心代码,大图片用文字合成的方式不容易出现内存爆炸的情况
    source_img = Image.open ( infilepath )
    drawX = source_img.size[0]
    drawY = source_img.size[1]
    img = source_img.crop ( (0, 0, drawX, drawY) )
    img.paste ( scene_text, mask=scene_text )
    print ( outfilepath )
    img.save ( outfilepath )
    img.close ()


def create_font_img():
    drawX = 11524
    drawY = 8650
    textstr = 'ahahah'   #这里是水印的内容
    font = ImageFont.truetype ( "fonts/msyh.ttc", 25 )
    fontx = int ( font.getsize ( textstr )[0] * 1.5 )
    fonty = int ( font.getsize ( textstr )[1] * 1.5 )
    scene_text = Image.new ( 'RGBA', (drawX, drawY) )  # 此处是个坑
    draw = ImageDraw.Draw ( scene_text )

    # 画5个字段,方位为中心加四个角落,改这里参数可以修改水印位置
    water_pos = [
        (33, 33),
        (drawX - fontx, drawY - fonty),
        (drawX * 0.5, drawY * 0.5),
        (33, drawY - fonty),
        (drawX - fontx, 33),
    ]
    for key in water_pos:
        # print(key)
        draw.text ( key, textstr, fill=(255, 255, 255, 125), font=font )
    return scene_text

posted on 2019-04-01 09:00  钻风  阅读(279)  评论(0)    收藏  举报

导航