PIL模块使用范例

基础用法

from PIL import Image

"""
mode : 返回图像的模式,常用模式有:
    L (luminance) 灰度图像,8位像素,表示黑和白
    RGB 3x8位像素,为真彩色图像
    RGBA 4x8位像素,有透明通道的真彩色
    CMYK 4x8位像素,颜色分离,出版图像
    P 8位像素,使用调色板映射到其他模式
    1 1位像素,表示黑和白,但是存储的时候每个像素存储为8bit
    YCbCr:3x8位像素,彩色视频格式
    I 32位整型像素
    F 32位浮点型像素
PIL支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)
"""
def main():
    im = Image.open('example.jpg')  # 打开图片

    """TODO 1 打印图片大小    (1680, 1050)"""
    #size : 是一个二元tuple,包含width和height(宽度和高度,单位是px)
    
    print(im.size)

    """TODO 2 打印图片格式    JPEG"""
    #format: 返回图像格式(PNG, JPG,…),如果图像不是从文件读取的,则值None
    print(im.format)

    """TODO 3 打印图片色彩模式    RGB"""
    print(im.mode)

    """TODO 4 返回palette实例  None  """
    #palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例
    
    print(im.palette)

    """TODO 5 info信息,{'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)}"""
    #info : info信息,返回/设置图像一些额外信息,一个字典结构对象
    
    print(im.info)

    #查看照片
    #im.show()

    #保存照片
    #im.save()


if __name__ == '__main__':
    main()

进阶使用一

from PIL import Image

"""
进阶操作
"""
def main():
    im = Image.open('example.jpg')  # 打开图片

    """TODO 1 创建缩略图   """
    # x,y=im.size#获取宽高
    #
    # #print(im.size)  #原来(1680, 1050)
    # im.thumbnail((x//2,y//2))#宽高减半缩小
    # #print(im.size)#缩略后(840, 525)
    #
    # im.save('jia02thumbnail.jpg')#缩略图保存

    """TODO 2 裁剪照片 左上角为坐标原点(左,上,右,下)"""
    # selected=(610,140,1100,820)#裁剪坐标
    # region=im.crop(selected)#根据范围裁剪
    # region.save('jia02crop.jpg')#裁剪图片保存

    """TODO 3 几何变换 """

    # out = im.resize((2180, 1300))#设置图像大小
    # out.show()#图像查看

    # out = im.rotate(45)# 顺时针选择45度,支持任意度数
    # out.show()

    # 旋转图像

    # out = im.transpose(Image.FLIP_LEFT_RIGHT)# 左右颠倒
    # out.show()

    # out = im.transpose(Image.FLIP_TOP_BOTTOM)#上下颠倒
    # out.show()

    # out = im.transpose(Image.ROTATE_90)# 支持旋转90°,180°,270°,不支持任意度数
    # out.show()

    """TODO 4 图像模式转换"""
    # print(im.mode)#RGB彩色模式
    #
    # im = im.convert("L")# 转换灰色
    # im.save('jia02L.jpg')

    """TODO 5 图片粘贴 把一个图片一份两半,右半部分粘贴到左边,左半部分粘贴到右边"""
    # Image.paste(image, box) 将一个Image实例粘贴到另一个Image实例上

    # w, h = im.size
    # right_im = im.crop((w // 2, 0, w, h))
    # left_im = im.crop((0, 0, w // 2, h))
    # im.paste(left_im, (w // 2, 0, w, h))
    # im.paste(right_im, (0, 0, w // 2, h))#
    # im.save('jia02paste.jpg')

    """TODO 6 图片填充 """
    #Image.paste(colour, box) 可以把颜色填充到box对应的区域,对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组

    # w, h = im.size
    # im.paste((1, 149, 200), (w // 4, h // 4, w * 3 // 4, h * 3 // 4))
    # im.save('jia02color.jpg')

    """TODO 7 分离和合并颜色通道"""
    # Image.split()将图像各通道进行分离,每个通道即是一个图像
    # Image.merge()将多个单通道图像合并,创建新图像

    # r, g, b = im.split()#RGB图片按通道分离
    # # 单通道图像保存
    # r.save('jia02R.jpg')
    # g.save('jia02G.jpg')
    # b.save('jia02B.jpg')
    # # 大量通道次序,合并
    # im1 = Image.merge("RGB", (g, b, r))
    # im1.save('jia02merge.jpg')

if __name__ == '__main__':
    main()

进阶使用二

from PIL import Image,ImageDraw,ImageFont,ImageGrab,ImageFilter

"""
图像操作
"""
def deffun(c):
    return c*1.5# 亮度增强


def main():
    im = Image.open('example.jpg')  # 打开图片

    """TODO 1 画线   """
    # Draw.line(xy, options)函数绘制直线
    #      其中 xy 表示坐标列表,它可以是[(x,y),…]或者[x,y,…]的形式:
    # options可用的选项:
    #   fill = (R, G, B) :指定线条颜色
    #   width = integer :指定线条宽度,单位是px

    # dr_im = ImageDraw.Draw(im)# 创建Draw类的实例
    # w, h = im.size  # 宽高
    # dr_im.line([0, 0.33 * h, w, 0.33 * h], fill=(0, 0, 0), width=6) # 三等分位置画线,黑色,6px
    # dr_im.line([(0, h), (0.5 * w, 0.5 * h), (w, h)], fill=(0, 0, 0), width=6)# 左下角到中心点,右下角到中心点
    # im.save('jia03line.jpg') #本地保存

    """TODO 2 画弧度)"""
    # Draw.arc(xy, start, end, options)函数来绘制弧线
    # xy是个长度为4的列表,如[x0, y0, x1, y1],表示(左上右下),左上为坐标原点
    # start和end则是弧的起止角度,其中水平向右的方向为0°,顺时针方向
    # options中可用选项:fill = (R, G, B) :指定线条颜色

    # dr_im = ImageDraw.Draw(im)# 创建Draw类的实例
    # dr_im.arc([10, 20, 100, 300], 0, 360, fill=(255, 255, 255))#位置,起始角度,结束角度,线条颜色
    # im.save('jia03arc.jpg')

    """TODO 3 截图 """
    #ImageGrab.grab方法,可实现全屏截图,区域截图
    #PIL.ImageGrab.grabclipboard() 方法获取剪切板内的图片

    # im = ImageGrab.grab()# 全屏截屏
    # im.show()
    # im=ImageGrab.grab((400, 100, 1400, 700))#区域截图
    # im.show()
    # ImageGrab.grabclipboard().show()#剪切板截图显示

    """TODO 4 损坏检测"""
    #verify() 尝试判断文件是否损坏   注:没有任何输出,表示图像im没有损坏

    # print(im.verify())


    """TODO 5 图片拷贝"""
    # Image.copy()函数

    # im2 = im.copy()
    # im2.save("jia03copy.jpg")

    """TODO 6 像素值 """
    #Image.getpixel(xy)函数,返回给定位置的像素值,如果图像为多通道,则返回一个元组

    # print(im.getpixel((1, 1)))
    # print(im.getpixel((649, 649)))

    """TODO 7 回调函数"""
    # Image.eval(image,function) 使用回调函数处理image图像中每一个像素点
    # 如果变量image有多个通道,那回调函数将作用于每一个通道

    # im = Image.eval(im, deffun)
    # im.show()

    """TODO 8 图像滤镜"""
    #imageFilter是PIL滤镜模块,提供了滤波器的相关定义,这些滤波器主要用于Image.filter()方法

    # im = im.filter(ImageFilter.SMOOTH)# 平滑滤镜
    # im.show()
    #
    # im = im.filter(ImageFilter.SMOOTH_MORE)  # 平滑滤镜(阀值更大)
    # im.show()

    # im = im.filter(ImageFilter.CONTOUR)  # 只显示轮廓(白底素描)
    # im.show()
    #
    # im = im.filter(ImageFilter.FIND_EDGES)  # 边界滤镜(黑底素描)
    # im.show()

    # im = im.filter(ImageFilter.SHARPEN)  # 锐化滤镜
    # im.show()

    # im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)# 线条边界加强(阀值更大)
    # im.show()

    # im = im.filter(ImageFilter.BLUR)# 模糊滤镜
    # im.show()

    # im = im.filter(ImageFilter.EMBOSS)# 浮雕滤镜
    # im.show()

    """TODO 9 加文字"""
    # dr_im = ImageDraw.Draw(im)
    # w,h=im.size
    # font = ImageFont.truetype("‪C:\Windows\Fonts\simhei.ttf", 40)
    # # 如果不适用myFont字体实例,则使用PIL默认字体
    # dr_im.text([0.1 * w, 0.8 * h], "灼眼的夏娜", fill=(255, 255, 0), font=font)
    # dr_im.text([0.5 * w, 0.8 * h], "灼眼的夏娜", fill='red', font=font)
    # im.show()

    """TODO 10 创建图像"""
    # PIL.image.new(mode, size, color=0)
    # 使用模式和大小,创建一个新的图像。其中,mode可以是”L”, ”RGB”, ”RGBA”;而size则是一个tuple(元组), color应该和mode相对应。
    # 下面例子,分别创建”L”、”RGB”和”RGBA”的图片



    # # 创建一个RGb图像
    # newrgb = Image.new("RGB", (28, 28), (20, 200, 45))
    # newrgb.show()
    #
    # newrgba = Image.new("RGBA", (28, 28), (20, 200, 45, 255))
    # newrgba.show()

    # newL = Image.new("L", (280, 280), 255)
    # dr_im = ImageDraw.Draw(newL)
    # w, h = newL.size
    # font = ImageFont.truetype("‪C:\Windows\Fonts\simhei.ttf", 35)
    # # 如果不适用myFont字体实例,则使用PIL默认字体
    # # dr_im.text([0.1 * w, 0.8 * h], "灼眼的夏娜", fill=(255, 255, 0), font=font)
    # dr_im.text([0.5 * w, 0.8 * h], "灼眼的夏娜", fill='red', font=font)
    # newL.show()
if __name__ == '__main__':
    main()

你可能感兴趣的:(python常用模块)