美文网首页Python
Python-Pillow库常用处理图像

Python-Pillow库常用处理图像

作者: 忘了呼吸的那只猫 | 来源:发表于2020-08-30 15:31 被阅读0次

原图:

操作一: 缩略图(通常不用这个方式,因为图片质量损坏太大)

from PIL import Image

def compress_image(img, w=128, h=128):
    '''
    缩略图
    '''
    img.thumbnail((w,h))  #也可以使用resize()方法
    im.save('test1.png', 'PNG')

if __name__ == '__main__':
    img = Image.open('123.jpg') #path为图片地址
    compress_image(img)

操作二 : 旋转图片中的某一部分

from PIL import Image

def cut_image(img):
    '''
    截图, 旋转,再粘贴
    '''
    #eft, upper, right, lower
    #x y z w  x,y 是起点, z,w是偏移值
    width, height = img.size
    box = (width-200, height-100, width, height)
    region = img.crop(box)
    #旋转角度
    region = region.transpose(Image.ROTATE_180)
    img.paste(region, box)
    img.save('test2.jpg', 'JPEG')

if __name__ == '__main__':
    img = Image.open('123.jpg') 
    cut_image(img)

操作三: 给图片添加一个图片水印, 2张图层合并

from PIL import Image

def logo_watermark(img, logo_path):
    '''
    添加一个图片水印,原理就是合并图层,用png比较好
    '''
    baseim = img
    logoim = Image.open(logo_path)
    bw, bh = baseim.size
    lw, lh = logoim.size
    baseim.paste(logoim, (bw-lw, bh-lh))
    baseim.save('test3.jpg', 'JPEG')

if __name__ == '__main__':
    img = Image.open('123.jpg') #path为图片地址
    logo_watermark(img, '321.png')

操作四: 给图片添加文字水印,这个用的比较多, 我这里弄了个白色通明低,可以弄成完全透明的

from PIL import Image, ImageFont, ImageDraw, ImageEnhance

def text_watermark(img, text, out_file="test4.jpg", angle=23, opacity=0.50):
    '''
    添加一个文字水印,做成透明水印的模样,应该是png图层合并
    http://www.pythoncentral.io/watermark-images-python-2x/
    这里会产生著名的 ImportError("The _imagingft C module is not installed") 错误
    Pillow通过安装来解决 pip install Pillow
    '''
    watermark = Image.new('RGBA', img.size,(255,255,255)) #我这里有一层白色的膜,去掉(255,255,255) 这个参数就好了
    FONT = "my_font.TTF"
    size = 2
 
    n_font = ImageFont.truetype(FONT, size)                                       #得到字体
    n_width, n_height = n_font.getsize(text)
    text_box = min(watermark.size[0], watermark.size[1])
    while (n_width+n_height <  text_box):
        size += 2
        n_font = ImageFont.truetype(FONT, size=size)
        n_width, n_height = n_font.getsize(text)                                   #文字逐渐放大,但是要小于图片的宽高最小值
 
    text_width = (watermark.size[0] - n_width) / 2
    text_height = (watermark.size[1] - n_height) / 2
    #watermark = watermark.resize((text_width,text_height), Image.ANTIALIAS)
    draw = ImageDraw.Draw(watermark, 'RGBA')                                       #在水印层加画笔
    draw.text((text_width,text_height),
              text, font=n_font, fill="#21ACDA")
    watermark = watermark.rotate(angle, Image.BICUBIC) # Image.BICUBIC 是设置缩放图片质量的参数
    watermark.show()
    alpha = watermark.split()[3]
    alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
    watermark.putalpha(alpha)   #putalpha()函数可以将模式为'L'或'1'的图片写入到原图的透明通道中,但原图必须有透明通道即原图模式为'RGBA'
    Image.composite(watermark, img, watermark).save(out_file, 'JPEG')


if __name__ == '__main__':
    img = Image.open('123.jpg') #path为图片地址
    text_watermark(img, '水印文本')

操作 五 等比压缩(比较适合做缩略图)

from PIL import Image, ImageFont, ImageDraw, ImageEnhance

def resizeImg(img, dst_w=0, dst_h=0, qua=85):
    '''
    只给了宽或者高,或者两个都给了,然后取比例合适的
    如果给的图片比要压缩的尺寸都要小,就不压缩了,
    qua这个参数是保存图片的质量一般在1-95,尽量避免超过95
    '''
    ori_w, ori_h = img.size
    widthRatio = heightRatio = None
    ratio = 1
 
    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
 
    img.resize((newWidth,newHeight),Image.ANTIALIAS).save("test5.jpg", "JPEG", quality=qua)
 
    '''
    Image.ANTIALIAS还有如下值:
    NEAREST: use nearest neighbour
    BILINEAR: linear interpolation in a 2x2 environment
    BICUBIC:cubic spline interpolation in a 4x4 environment
    ANTIALIAS:best down-sizing filter
    '''


if __name__ == '__main__':
    img = Image.open('123.jpg') #path为图片地址
    resizeImg(img, 120,80)

操作六 按照比例剪裁之后,等比压缩,有时候需要定比例的图片可以这么做

from PIL import Image, ImageFont, ImageDraw, ImageEnhance

def clipResizeImg(img, dst_w, dst_h, qua=95):
    '''
        先按照一个比例对图片剪裁,然后在压缩到指定尺寸
        一个图片 16:5 ,压缩为 2:1 并且宽为200,就要先把图片裁剪成 10:5,然后在等比压缩
    '''
    ori_w,ori_h = img.size
 
    dst_scale = float(dst_w) / dst_h  #目标高宽比
    ori_scale = float(ori_w) / ori_h #原高宽比
 
    if ori_scale <= dst_scale:
        #过高
        width = ori_w
        height = int(width/dst_scale)
 
        x = 0
        y = (ori_h - height) / 2
 
    else:
        #过宽
        height = ori_h
        width = int(height*dst_scale)
 
        x = (ori_w - width) / 2
        y = 0
 
    #裁剪
    box = (x,y,width+x,height+y)
    #这里的参数可以这么认为:从某图的(x,y)坐标开始截,截到(width+x,height+y)坐标
    #所包围的图像,crop方法与php中的imagecopy方法大为不一样
    newIm = img.crop(box)
    img = None
 
    #压缩
    ratio = float(dst_w) / width
    newWidth = int(width * ratio)
    newHeight = int(height * ratio)
    newIm.resize((newWidth,newHeight),Image.ANTIALIAS).save("test6.jpg", "JPEG",quality=95)


if __name__ == '__main__':
    img = Image.open('123.jpg') #path为图片地址
    clipResizeImg(img, 100,200)

相关文章

  • Python-Pillow库常用处理图像

    原图: 操作一: 缩略图(通常不用这个方式,因为图片质量损坏太大) 操作二 : 旋转图片中的某一部分 操作三: 给...

  • Skimage

    Python中常用图像处理库 skimage opencv PIL (Python Imaging Library...

  • 常用的图像处理库

    (1)PIL库 PIL 是通用的python 图像处理库,可实现基本的图像缩放、裁剪、旋转和颜色转换等操作。其最重...

  • iOS常用第三方库《一》

    IOS常用第三方库《转》 UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照...

  • Opencv3计算机视觉

    Opencv是图像处理领域常用的视觉库,为了加强对图像算法的理解,重新回顾一下这些基础的图像算法,使用Python...

  • Python-Image 基本的图像处理操作

    Python-Image 基本的图像处理操作,有需要的朋友可以参考下。 Python 里面最常用的图像操作库是 I...

  • python Image 模块处理图片

    Python-Image 基本的图像处理操作,有需要的朋友可以参考下。 Python 里面最常用的图像操作库是 I...

  • 常用的python图像处理库

    今天的世界充满了数据,图像是这些数据的重要组成部分。但是,在使用它们之前,必须对这些数字图像进行处理 - 分析和操...

  • PIL基本操作

    PIL: python图像处理类库 PIL(Python Imaging Library Python,图像处理类...

  • 图像金字塔

    图像金字塔是图像处理和计算机视觉中常用到的概念,常常用于多尺度处理领域(multiscale processing...

网友评论

    本文标题:Python-Pillow库常用处理图像

    本文链接:https://www.haomeiwen.com/subject/yphssktx.html