Python照片等比例压缩算法

照片压缩也算是个常用的功能, 现在我把照片压缩和水印添加封装在一起。供大家参考!

from PIL import Image

#等比例压缩图片 +添加水印logo
def resizeImg(img, dst_w=0, dst_h=0, qua=85):
    '''''
    只给了宽或者高,或者两个都给了,然后取比例合适的
    如果图片比给要压缩的尺寸都要小,就不压缩了
    '''
    im = Image.open(img)
    logo_path = 'logo.png' #水印图

    ori_w, ori_h = im.size
    widthRatio = heightRatio = None
    ratio = 1
    print ori_w,ori_h
    if (ori_w and ori_w > dst_w) or (ori_h and ori_h  > dst_h):
        if dst_w and ori_w > dst_w:
            widthRatio = float(dst_w) / ori_w                                      #正确获取小数的方式
        if dst_h and ori_h > dst_h:
            heightRatio = float(dst_h) / ori_h
        if widthRatio and heightRatio:
            if widthRatio < heightRatio:
                ratio = widthRatio
            else:
                ratio = heightRatio
        if widthRatio and not heightRatio:
            ratio = widthRatio
        if heightRatio and not widthRatio:
            ratio = heightRatio
        newWidth = int(ori_w * ratio)
        newHeight = int(ori_h * ratio)
    else:
        newWidth = ori_w
        newHeight = ori_h
    im.resize((newWidth,newHeight),Image.ANTIALIAS).save(img, "JPEG", quality=qua)

    '''''
    添加一个图片水印,原理就是合并图层,用png比较好
    '''
    baseim = Image.open(img)
    logoim = Image.open(logo_path)
    r,g,b,a = logoim.split()

    #计算中心然后二图减法计算位置(x,y)
    centerW = newWidth/2
    centerH = newHeight/2
    LogoCenterW= 300/2
    LogoCenterH= 114/2

    bw, bh = baseim.size
    lw, lh = logoim.size
  #注意mask必须要加 只取a值
    baseim.paste(logoim,box=(centerW-LogoCenterW,centerH-LogoCenterH),mask=a)
    baseim.save(img, 'JPEG')


if __name__ == "__main__":
      # image 对象
    filename = resizeImg('test.jpg', dst_w=1024, qua=85) #调整尺寸