python:图片叠加

原始代码:https://github.com/dby/photo_joint

# -*- coding: utf-8 -*-
# @Author: 963561673
# @Date:   2019-08-20 21:05:01
# @Last Modified by:   963561673
# @Last Modified time: 2019-08-21 21:59:47
#coding: utf-8

#
# @note: 这里两张照片层叠选择的方法是:
#   假设两张照片的同一点的像素分别为A,B,则层叠之后该点得像素为(alpha取值在0和1之间):
#       A * alpha + B * (1-alpha)
#

from __future__ import division
import PIL
from PIL import Image
import numpy
import numexpr
import os
import random
import time
from PIL import ImageFont
from PIL import ImageDraw
import math

STAG = time.time()

# W_num: 一行放多少张照片
# H_num: 一列放多少张照片
# W_size: 照片宽为多少
# H_size: 照片高为多少
# root: 脚本的根目录
root = ""
W_num = 20
H_num = 20
W_size = 1920
H_size = 1080

# 防止像素超限不能缩放
limit = 89478485
if W_num * H_num * W_size * H_size > limit:
    k = [x for x in range(1, W_size + 1) if W_size % x == 0 and H_size % x == 0][-1]
    num_gg = int(math.sqrt(limit * k * k / W_num / H_num / W_size / H_size))
    W_size = int(W_size / k * num_gg)
    H_size = int(H_size / k * num_gg)


# aval: 存放所有的照片的路径
aval = []
alpha = 0.3  # 小图的透明度


# name: getAllPhtots
# todo: 获得所有照片的路径
def getAllPhtots():
    time_get = time.time()
    root = os.getcwd() + "/"
    src = root + "1/"  # 小图的文件夹
    for i in os.listdir(src):
        if os.path.splitext(src + i)[-1] == ".jpg":
            aval.append(src + i)
    print('获取所有图片成功...耗时:%s秒' % round(time.time() - time_get, 4))


# name: treansfer
# todo: 将照片转为一样的大小
def transfer(img_path, dst_width, dst_height):
    im = Image.open(img_path)
    if im.mode != "RGBA":
        im = im.convert("RGBA")
    s_w, s_h = im.size
    if s_w < s_h:
        im = im.rotate(90)

    STA = time.time()
    resized_img = im.resize((dst_width, dst_height), Image.ANTIALIAS)
    #print("Transfer Func Time %s" % (time.time() - STA))
    return numpy.array(resized_img)[:dst_height, :dst_width]


# name: createNevImg
# todo: 创造一张新的图片,并保存
def createNevImg():
    iW_size = W_num * W_size
    iH_size = H_num * H_size
    I = numpy.array(transfer(root + "160.jpg", iW_size, iH_size))  # 大图的路径
    time_e = time.time()
    I = numexpr.evaluate("""I*(1-alpha)""")
    print('修改大图耗时%s秒...' % round(time.time() - time_e, 4))
    time_c = time.time()
    for i in range(W_num):
        time_i = time.time()
        for j in range(H_num):
            SH = I[(j * H_size):((j + 1) * H_size), (i * W_size):((i + 1) * W_size)]
            STA = time.time()
            DA = transfer(random.choice(aval), W_size, H_size)
            #print("Cal Func Time %s" % (time.time() - STA))
            res = numexpr.evaluate("""SH+DA*alpha""")
            I[(j * H_size):((j + 1) * H_size), (i * W_size):((i + 1) * W_size)] = res
        print('第%s行绘制成功...耗时:%s秒' % (i + 1, round(time.time() - time_i, 4)))
    print('图片绘制成功...耗时:%s秒' % round(time.time() - time_c, 4))
    time_z = time.time()
    im = Image.fromarray(I.astype(numpy.uint8))
    im2 = im.resize((3200, 1800), Image.ANTIALIAS)
    im2.save("createNewImg_%s_160.png" % alpha)
    print('图片制作成功...耗时:%s秒' % round(time.time() - time_z, 4))

# name: newRotateImage
# todo: 将createnevimg中得到的照片旋转,粘贴到另外一张照片中


def newRotateImage():
    imName = "createNevImg_%s_past3.png" % alpha
    print("正在将图片旋转中...")
    im = Image.open(imName)
    im2 = Image.new("RGBA", (W_size * int(W_num + 1), H_size * (H_num + 4)))
    im2.paste(im, (int(0.5 * W_size), int(0.8 * H_size)))
    im2.save("newRotateImage_%s_past3.png" % alpha)


# name: writetoimage
# todo: 在图片中写祝福语
def writeToImage():
    print("正在向图片中添加祝福语...")
    img = Image.open("newRotateImage_%s_past3.jpg" % alpha)
    font = ImageFont.truetype('xindexingcao57.ttf', 600)
    draw = ImageDraw.Draw(img)
    draw.ink = 21 + 118 * 256 + 65 * 256 * 256

    # draw.text((0,H_size * 6),unicode("happy every day",'utf-8'),(0,0,0),font=font)

    tHeight = H_num + 1
    draw.text((W_size * 0.5, H_size * tHeight), "happy life written by python", font=font)
    img.save("final_%s_past3.jpg" % alpha)


# name:
# todo: 入口函数
if __name__ == "__main__":

    getAllPhtots()
    createNevImg()
    # newRotateImage()
    # writeToImage()
    print("总计时:%s秒" % round(time.time() - STAG, 4))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值