python 批量生成九宫格

前言

代码是东拼西凑的,不专业很业余。 大佬勿喷!!!狗头保命。

效果图

在这里插入图片描述

代码

import cv2
import random
import numpy
import os
import time
import glob
from PIL import Image, ImageDraw, ImageFont


def file_name(file_dir):
    filepaths=[]
    filess=[]
    for root, dirs, files in os.walk(file_dir):             
        # print(root) #当前目录路径
        # print(dirs) #当前路径下所有子目录
        print(files) #当前路径下所有非目录子文件  
        filess=files

    for filename in files:    
        tmp=file_dir+"\\"+filename
        filepaths.append(tmp)
    return filepaths

def cv2ImgAddText(img, text, left, top, textColor=(0, 0, 0), textSize=20):
    if (isinstance(img, numpy.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        "font/simsun.ttc", textSize, encoding="utf-8")
    # 绘制文本
    draw.text((left, top), text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)

def geneHead(videoname,videosize,x,y):
    background = Image.new('RGB', (x,y), "Beige")
    # img2 = cv2.putText(background, videoname, (100, 100), cv2.LINE_AA, 2, (249, 249, 249), 4)
    background.save("./head.png")
    img=cv2.imread("./head.png")
    img= cv2ImgAddText(img,"FileName:"+videoname,100,100,(0, 0, 0),60)
    img= cv2ImgAddText(img,"FileSize:"+str(videosize)+"MB",100,200,(0, 0, 0),60)
    cv2.imwrite("./head.png", img)  
    return img


def contatHeaAndNine(head,nine,w,h,disname):
    """ image_names: list, 存放的是图片的绝对路径 """
    # 1.创建一块背景布
    target_shape = (int(3*w),int(3*h+300))
    background = Image.new('RGBA', target_shape, (0,0,0,0,))

    background.paste(head, (0,0))
    background.paste(nine, (0,300))
    background.save("./"+disname)


def image_concat(image_names):
    """ image_names: list, 存放的是图片的绝对路径 """
    # 1.创建一块背景布
    image = Image.open(image_names[0])
    width, height = image.size
    target_shape = (3*width, 3*height)
    background = Image.new('RGBA', target_shape, (0,0,0,0,))
    # 2.依次将图片放入背景中(注意图片尺寸规整、mode规整、放置位置)
    for ind, image_name in enumerate(image_names):
        img = Image.open(image_name)
        img = img.resize((width, height))  # 尺寸规整
        if img.mode != "RGBA":             # mode规整
            img = img.convert("RGBA")
        row, col = ind//3, ind%3
        location = (col*width, row*height) # 放置位置
        background.paste(img, location)
    background.save("./nine.png")

def timeformat(num):
    a = time.strftime('%H:%M:%S', time.gmtime(num))
    print(a)
    return a

def get_video_duration(filename):
  cap = cv2.VideoCapture(filename)
  if cap.isOpened():
    rate = cap.get(5)
    frame_num =cap.get(7)
    duration = frame_num/rate
    return duration
  return -1

def get_frame_from_video(video_name, frame_time, img_dir, img_name,w,h,text):
    vidcap = cv2.VideoCapture(video_name)
    vidcap.set(cv2.CAP_PROP_POS_FRAMES, frame_time - 1)
    success, image = vidcap.read()
    image=addwoater(image,w,h,str(timeformat(text)))
    if not os.path.exists(img_dir):
        os.makedirs(img_dir)
    if success:
        cv2.imwrite(img_dir + img_name, image)  

def get_vedio_height_width(filename):
    cap = cv2.VideoCapture(filename)
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH )
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    return width,height


def addwoater(img,w,h,text):
    print(w)
    img2 = cv2.putText(img, text, (100, 100), cv2.LINE_AA, 2, (249, 249, 249), 4)
    return img2
def get_FileSize(filePath):
    fsize = os.path.getsize(filePath)
    fsize = fsize/float(1024*1024)
    return round(fsize,2)

def getFileName(url):
    tmp=url.split("\\")
    return tmp[len(tmp)-1]


def compressImage(srcPath,dstPath):

    #打开原图片缩小后保存,可以用if srcFile.endswith(".jpg")或者split,splitext等函数等针对特定文件压缩
    sImg=Image.open(srcFile)
    w,h=sImg.size
    dImg.save(dstFile) #也可以用srcFile原路径保存,或者更改后缀保存,save这个函数后面可以加压缩编码选项JPEG之类的

     
#图片数量
picnum=10
def main(url):
    # 视频大小
    mb=get_FileSize(url)
    #视频名称
    filename=getFileName(url)
    #视频长宽
    w,h=get_vedio_height_width(url)
    #总帧数
    sumframenum = cv2.VideoCapture(url).get(7)
    # 视频时间长度
    videolength=get_video_duration(url)
    # 分段间隔
    d=sumframenum/picnum
    #生成的帧号序列
    framestamp=[]
    #帧号获得时间戳
    timestamp=[]
    rand=random.uniform(0.8,1)
    for i in range(picnum):
        if(i==0):
            continue
        frame=rand*d*i
        framestamp.append(frame)
        timestamp.append(frame/sumframenum*videolength)

    flag=1
    for i in framestamp:
        get_frame_from_video(url,i,"./test/","IMAGE"+str(flag)+".PNG",w,h,timestamp[flag-1])
        flag=flag+1
    img_dir = "./test/"
    image_names = sorted(glob.glob(img_dir+"*"))
    image_concat(image_names)
    geneHead(filename,mb,int(w*3),300)
    contatHeaAndNine(Image.open("./head.png"),Image.open("./nine.png"),w,h,filename+"9.png")


filepaths=file_name(r"C://")
print(filepaths)

urls=filepaths
for i in urls:
    main(i)


版权声明:本文为UFOO2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。