基于网上PIL图像合成教程产生的一些思考

在引出问题之前,先来了解一下PIL的基本使用

基础的Image Moudule基本用法

1
2
3
4
5
6
7
8
from PIL import Image
im = Image.open('./images/kebi1.jpg')
# Open, rotate, and display an image (using the default viewer)
# rotate()旋转一定角度
im.rotate(45).show()
if False:
# 保存图片
im.rotate(45).save('./images/rotate.jpg')
  • Create thumbnails(缩略图)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from PIL import Image
    import glob
    import os

    size = 128, 128

    # The following script creates nice 128x128 thumbnails of all JPEG images in the current directory.
    for infile in glob.glob("*.jpg"):
    file, ext = os.path.splitext(infile)
    im = Image.open(infile)
    im.thumbnail(size)
    im.save(file + "thumbnail", "JPEG")
  • 给图片加水印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from PIL import Image, ImageDraw,ImageFont
    # convert()进行图像格式的转变
    # PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
    im = Image.open("d:/pic/kebi1.jpg").convert('RGBA')

    # 新建一个Image
    txt=Image.new('RGBA', im.size, (0,0,0,0))
    fnt=ImageFont.truetype("c:/Windows/fonts/Tahoma.ttf", 20)
    d=ImageDraw.Draw(txt)
    d.text((txt.size[0]-80,txt.size[1]-30), "IWTF",font=fnt, fill=(255,255,255,255))

    # 图片合成
    # 要求: 1. 图像格式为RGBA
    # 2. 两个图像要大小相同
    out=Image.alpha_composite(im, txt)
    out.show()

    对于PNG、BMP和JPG彩色图像格式之间的互相转换都可以通过Image模块的open()和save()函数来完成。

    对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

  • PIL.Image.composite(image1, image2, mask)

    类似于blend,alpha_composite。这里使用了mask遮罩

    • 条件:大小一样,mask图片mode为1,L,RGBA
    • 作用:Create composite image by blending images using a transparency mask.

网上常见的教程

1
2
3
4
5
6
7
8
9
10
11
out = image1 * (1.0 - alpha) + image2 * alpha
from PIL import Image
img1 = Image.open("./images/kebi1.jpg")
img2 = Image.open("./images/kebi2.jpg")

print("打印输入图片信息\n")
print("img1", img1.mode, img1.size)
print("img2", img2.mode, img2.size)

newImg = Image.blend(img1, img2, 0.4)
newImg.save('./images/blendResult.jpg')

问题

  1. 使用blend(混合)需要两张图片具有相同的格式 && 相同的大小

    有没有什么更好的方法来实现(限制条件更少)

思路

通过加小图到一个背景透明的大图上即可;然后将大图合成即可

其他常用图片操作

  • 图片合成

  • 改变图片透明度

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def changeAlpha(im, alpha):
    im = im.convert("RGBA")
    x, y = im.size

    for i in range(x):
    for j in range(y):
    color = im.getpixel((i, j))
    color = color[:-1] + (alpha, )
    im.putpixel((i, j), color)

    im.save("out.PNG")

【参考文献】

python PIL 图像处理