【教学类-77-01】20241005青花瓷立体书

背景需求:

今天翻到小红书上一个青花瓷立体书

🇭🇰香港免费展览|青花瓷立体纸艺观展册📖 - 小红书 (xiaohongshu.com)icon-default.png?t=O83Ahttps://www.xiaohongshu.com/discovery/item/6426a8fb000000001303653e?app_platform=android&ignoreEngage=true&app_version=8.55.6&share_from_user_hidden=true&xsec_source=app_share&type=video&xsec_token=CBqQin_n9ou_OU9AExkGzXr4CeZu2OYzF6CPBfKEUMsCs=&author_share=1&xhsshare=WeixinSession&shareRedId=ODszMTs4Nk82NzUyOTgwNjg3OTlHS0xC&apptime=1728127439&share_id=34dfc2ae32364240a9f6371008f082ea

还有一些民用版的,感觉大班也可以在《我是中国人》主题里做这一款立体书青花瓷

小红书 - 你的生活指南 (xiaohongshu.com)icon-default.png?t=O83Ahttps://www.xiaohongshu.com/explore/64902dd200000000270020ba?app_platform=android&ignoreEngage=true&app_version=8.55.6&share_from_user_hidden=true&xsec_source=app_share&type=video&xsec_token=CBQwoTbdpxrlDyilvilLscEP3rwhkMx-mUafj01tBDMRw=&author_share=1&xhsshare=WeixinSession&shareRedId=ODszMTs4Nk82NzUyOTgwNjg3OTlHS0xC&apptime=1728127542&share_id=92b13e938bb14dcc915d817fefe9306a

但是青花瓷里面最大的问题,就是如何让孩子裁剪平行线?

我想制作一个带有实线(剪切线)虚线(折痕)的花瓶图纸模版,提升幼儿制作的精美度

青花瓷立体书

一、通义万相下载瓶子

关键词:

古代瓷瓶,纯白色背景,黑白轮廓线、瓶身空白,卡通简笔画,矢量图、简单、大,卡通。

二、下载图片

使用UIBOT下载图片,一次下载18套(72张)

三、挑选图片

这套关键词下载的瓷瓶有一些不足

1、瓶子左右不对称

2、瓶子边缘没有封闭

3、瓶子有颜色

先将图片大致分为两类

02有颜色文件夹里的图片目测可以用来修图

四、UIBOT白背景修图

用程序在PS修掉3:4图片的背景颜色,变成纯白色0,0,0

五、人工PS修掉青花瓷的彩色

代码部分

六、将空白瓶子图片放到制作文件夹内

因为挑选过,所以图片可能不连号,用代码先把图片变成001-1XX

'''
整理图片的编号,多的图片核对是否要删除
'''

# sz=5
import os
import random

def rename_images(folder_path):
    # 获取文件夹中的所有文件
    files = os.listdir(folder_path)
    # 过滤出图片文件(假设图片格式为.jpg)
    image_files = [f for f in files if f.endswith('.png')]
    
    
    numbers=1
    # 遍历图片文件并重命名
    for i, image_file in enumerate(image_files):
        # 构建新的文件名
        new_name = f'{numbers:03}.png'
        # 获取原文件和新文件的完整路径
        old_path = os.path.join(folder_path, image_file)
        new_path = os.path.join(folder_path, new_name)
        # 重命名文件
        os.rename(old_path, new_path)
        numbers+=1

# 调用函数,传入文件夹路径
rename_images(r'C:\Users\jg2yXRZ\OneDrive\桌面\青花瓷立体书\00图片')

七、制作对称图形

原始图片看上去是对称的,但程序制作后发现也不完全左右对称,这会影响立体书的90度结构

所以最简单的方法是将原始图片的左半部分复制一份,水平旋转,变成图片后半部分,这样就能让图片完全左右对称。


'''
青花瓷二:
Python读取123文件下所有图片,获取每张图片左右对撑线左边的图片,将其水平翻转,复制到图片的右侧,另存在234文件夹下。
星火讯飞,阿夏
20241005
'''

from PIL import Image
import os
from PIL import Image
import os

# 获取123文件夹下的所有图片文件
def get_image_files(folder):
    return [f for f in os.listdir(folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

# 处理图片并保存到234文件夹
def process_images(src_folder, dst_folder):
    image_files = get_image_files(src_folder)
    for file in image_files:
        # 打开图片并获取其大小
        src_img = Image.open(os.path.join(src_folder, file))
        width, height = src_img.size

        # 创建一个新的画布,大小与原图相同,背景颜色设置为白色
        new_img = Image.new('RGB', (width, height), color='white')

        # 将原图的左半部分复制到新画布的左侧
        left_half = src_img.crop((0, 0, width // 2, height))
        new_img.paste(left_half, (0, 0))

        # 将原图的左半部分水平翻转后,复制到新画布的右侧
        flipped_left_half = left_half.transpose(Image.FLIP_LEFT_RIGHT)
        new_img.paste(flipped_left_half, (width // 2, 0))

        # 保存处理后的图片到234文件夹下,文件名保持不变
        new_img.save(os.path.join(dst_folder, file))

# 调用函数处理图片
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\青花瓷立体书'
input_folder = path+r'\00图片'
output_folder =  path+r'\01对称'

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

process_images(input_folder, output_folder)

对称图效果(左右完全对称)

与原来的图片比较(原来图片存在不对称情况)

八、制作虚线图(生成全部图片)


'''
青花瓷立体书制作三
1、读取花瓶顶部和底部,平均切除10根实线
2、获取实线所在Y轴中所有X点,找到最左边的非白色X点left、找到最右边的非白色X点right
3、从第1根线向下,画出垂直虚线。
4、如果第2根线短于第1根线,就把第2根线左右延长到第1根线的长度。
工具:星火讯飞、阿夏
时间:2024年10月5日

'''


from PIL import Image, ImageDraw
import os

print('------1、提取花瓶的裁剪线和虚线---------')
def find_non_white_coordinates(image):
    width, height = image.size
    top_y = None
    bottom_y = None

    for y in range(height):
        for x in range(width):
            r, g, b = image.getpixel((x, y))
            if r != 255 or g != 255 or b != 255:
                top_y = y
                break
        if top_y is not None:
            break

    for y in range(height - 1, -1, -1):
        for x in range(width):
            r, g, b = image.getpixel((x, y))
            if r != 255 or g != 255 or b != 255:
                bottom_y = y
                break
        if bottom_y is not None:
            break

    return top_y, bottom_y

def find_non_white_x_coordinates(image, y):
    width, height = image.size
    left_x = None
    right_x = None

    for x in range(width):
        r, g, b = image.getpixel((x, y))
        if r != 255 or g != 255 or b != 255:
            left_x = x
            break

    for x in range(width - 1, -1, -1):
        r, g, b = image.getpixel((x, y))
        if r != 255 or g != 255 or b != 255:
            right_x = x
            break

    return left_x, right_x

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\青花瓷立体书'
input_folder = path+r'\01对称'
output_folder =  path+r'\02修图'


if not os.path.exists(output_folder):
    os.makedirs(output_folder)
# 需要剔除的图片    # 
no=[]  
for file in os.listdir(input_folder):
    if file.endswith(('.png', '.jpg', '.jpeg')):
        input_file = os.path.join(input_folder, file)
        output_file = os.path.join(output_folder, file)

        image = Image.open(input_file)
        draw = ImageDraw.Draw(image)
             # 顶部黑色坐标和底部黑色坐标
        top_y, bottom_y = find_non_white_coordinates(image)

         # 创建一个新的空白图像
        new_image = Image.new('RGB', image.size, (255, 255, 255))
        new_draw = ImageDraw.Draw(new_image)

        if top_y is not None and bottom_y is not None:
            # 计算距离和分割点数
            distance = bottom_y - top_y
            segment_count = 10
            segment_length = distance // segment_count
            print('s',segment_length)
            
            
            long=[]
            left=[]
            right=[]
            Y=[]
            # 画10条线段
            # n=0
            for i in range(segment_count + 1):
                
                y = top_y + i * segment_length
                # print(y)
                left_x, right_x = find_non_white_x_coordinates(image, y)

                if left_x is not None and right_x is not None:
                    new_draw.line([(left_x, y), (right_x, y)], fill='black', width=5)
                left.append(left_x)
                right.append(right_x)

                length = right_x - left_x
                # print(length)
                long.append(length)
                Y.append(y)
            print('long',long)
            print('left',left)
            print('right',right)
            print('Y',y)

            
            # 如果线段长度小于10像素,就放弃这张图
            for x in long:
                if int(x)<50:
                    print('不和规范的图片:'+file)
                    no.append(file)
            

            # 制作虚线折线
            for y in range(len(long)-1):   
                # 起始数字不能是0,否则虚线会超出顶部和底部            
                for i in range(8, segment_length, 8):
                    if i % 25 < 20:
                        color = (0, 0, 0)
                    else:
                        color = (255, 255, 255)
                    new_draw.line([(left[y]+1, Y[y]+i), (left[y]-1, Y[y]+i)], fill=color, width=10)
                    new_draw.line([(right[y]+1, Y[y]+i), (right[y]-1, Y[y]+i)], fill=color, width=10)
            
            # 如果第二条线比第1条线细,就延长到上面一条线的长度
            for z in range(len(long)-1):    
                if long[z]>long[z+1]:
                   
                    new_draw.line([(left[z], Y[z+1]), (right[z], Y[z+1])], fill='black', width=5)

                  
                    
                
                # 如果第1条线段长于第2条:从第1条线段的左侧右侧向下延伸 segment_length像素,画一条线段
                # 获取坐标点,画一条实线,
                # 如果第2条线段短于第3条,从第3条线段的左侧右侧向上延伸 segment_length像素,
                # if long[y]>long[y+1]:
                #     if long[y+1]>long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]-segment_length)], fill='black', width=5) 
                #         else:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]-segment_length)], fill='black', width=5) 
                #     if long[y+1]<long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5)   
                #         else:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5)     
                # if long[y]<long[y+1]:
                #     if long[y+1]>long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y], Y[y]), (left[y], Y[y]-segment_length)], fill='black', width=5)
                #         else:
                #             new_draw.line([(left[y], Y[y]), (left[y], Y[y]-segment_length)], fill='black', width=5)
                #     if long[y+1]<long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5)   
                #         if long[y]<long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5) 
                 
        # 在新图像上绘制黑色线条
        with Image.open(input_file) as img:
            width, height = img.size
            half_width = width // 2
            # 遍历图像的高度,步长为10。对于每个高度值i,
            for i in range(0, height, 10):
                if i % 40 < 20:
                    # 它检查i是否是40的倍数且小于20。如果是,它将颜色设置为黑色;否则,将颜色设置为白色。
                    color = (0, 0, 0)
                else:
                    color = (255, 255, 255)
                # 它在图像的中间位置(half_width)上下各偏移1个像素的位置绘制一条宽度为10的线段。这样,每隔40个像素,线段的颜色就会在黑色和白色之间交替变化。
                new_draw.line([(half_width - 1, i), (half_width + 1, i)], fill=color, width=10)

        # 保存处理后的图像
        new_image.save(output_file)

print(no)

# 将不符合的图片移走
import os
import shutil

source_folder = input_folder
target_folder = path+r'\04选出'

if not os.path.exists(target_folder):
    os.makedirs(target_folder)

for file_name in no:
    
    source_file = os.path.join(source_folder, file_name)
    target_file = os.path.join(target_folder, file_name)
    shutil.move(source_file, target_file)

print("图片已成功移动到目标文件夹。")

# 删选用,第二次要注释
import shutil
shutil.rmtree(output_folder) #递归删除文件夹,即:删除非空文件夹

最后生成了立体结构,包含“”实线“”(剪切线)和“虚线”(折痕线)

全部生图是123张

发现顶部的部分太细了,思考如果实线长度小于50像素,就跳过不要生成这一张。

筛选出以下这些图片不符合要求,小于50像素,移动到其他文件夹

最后符合条件的只有45张

再用代码生成一次(最后一行删除文件夹注释掉)

九、制作立体卡



'''
青花瓷立体书制作四
合成卡片(A4对折,包含背景纸)
工具:星火讯飞、阿夏
时间:2024年10月5日

'''

import os
import time
import shutil
from docx import Document
from docx.shared import Cm, Pt, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from PyPDF2 import PdfFileMerger, PdfFileReader
from docxtpl import DocxTemplate
import pandas as pd


path=r'C:\Users\jg2yXRZ\OneDrive\桌面\青花瓷立体书'

z_folder = path+r'\03虚线'
f_folder = path+r'\02修图'

z_files = [os.path.join(z_folder, f) for f in os.listdir(z_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]
f_files = [os.path.join(f_folder, f) for f in os.listdir(f_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

all=[]
for i in range(len(z_files)):
    all.append(z_files[i])
    all.append(f_files[i])
print(all)

# 创建临时文件夹
new_folder = path+r'\零时文件夹'
os.makedirs(new_folder, exist_ok=True)



for nn in range(0,int(len(all))):      # 读取图片的全路径  的数量 31张
    doc = Document(path+r'\02青花瓶A4.docx')
    table = doc.tables[0]          # 4567(8)行
#
    # 写入1张大图
    run=doc.tables[0].cell(1,0).paragraphs[0].add_run()        # # 图片位置 第一个表格的0 3 插入照片
    run.add_picture(r'{}'.format(all[nn]),width=Cm(10.58),height=Cm(14.1))
    table.cell(1,0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中 
  
    doc.save(new_folder+fr'\{nn:03d}.docx')   
    time.sleep(3)
    
print('----------第4步:把都有PDF合并为一个打印用PDF------------')

# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMerger

pdf_output_path = path+fr"\青花瓷立体书({len(z_files)}人共{len(z_files)}份).pdf"

# 将所有DOCX文件转换为PDF
for docx_file in os.listdir(new_folder):
    if docx_file.endswith('.docx'):
        docx_path = os.path.join(new_folder, docx_file)
        convert(docx_path, docx_path.replace('.docx', '.pdf'))


# 合并零时文件里所有PDF文件
merger = PdfFileMerger()
for pdf_file in os.listdir(new_folder):
    if pdf_file.endswith('.pdf'):
        pdf_path = os.path.join(new_folder, pdf_file)
        merger.append(pdf_path)
time.sleep(2)

# 保存合并后的PDF文件
merger.write(pdf_output_path)
merger.close()

# 删除输出文件夹
shutil.rmtree(new_folder)
# shutil.rmtree(zheng_path)
# shutil.rmtree(fan_path)
time.sleep(10)

花瓶顶部和底部都取最高一点,瓶口是圆弧,根本不到两侧的黑点,所以瓶口会很小。

所以我决定把顶部和底部的坐标点都向内移动10像素,

这下,123张图片都有比较宽的瓶口和瓶底了(所有图片的连线宽度都大于50像素)

综合代码:

'''
青花瓷立体贺卡
0、通义万相下载图片,ps修图、变成黑白色的图片
1、编号
2、图片翻转,左右对称图片
3、立体数的实线、虚线
(1)读取花瓶顶部和底部,平均切除10根实线
(2)获取实线所在Y轴中所有X点,找到最左边的非白色X点left、找到最右边的非白色X点right
(3)从第1根线向下,画出垂直虚线。
(4)如果第2根线短于第1根线,就把第2根线左右延长到第1根线的长度。
4.导入word模板,制作PDF

工具:通义万相、PS、星火讯飞,阿夏
时间:2024年10月5日
'''


# 调用函数处理图片
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\青花瓷立体书'
# 切割横线有几条(粗细)
num=20

print('-----1、重新编辑图片的编号,多的图片核对是否要删除------------')
# sz=5
import os
import random

def rename_images(folder_path):
    # 获取文件夹中的所有文件
    files = os.listdir(folder_path)
    # 过滤出图片文件(假设图片格式为.jpg)
    image_files = [f for f in files if f.endswith('.png')]
    
    
    numbers=1
    # 遍历图片文件并重命名
    for i, image_file in enumerate(image_files):
        # 构建新的文件名
        new_name = f'{numbers:03}.png'
        # 获取原文件和新文件的完整路径
        old_path = os.path.join(folder_path, image_file)
        new_path = os.path.join(folder_path, new_name)
        # 重命名文件
        os.rename(old_path, new_path)
        numbers+=1

# 调用函数,传入文件夹路径,原文件夹里将图片重命名为新编号
rename_images(path+r'\00图片')


print('-----2、花瓶左侧图案水平翻转到右侧,制作左右对称的新花瓶------------')

# 青花瓷二:
# Python读取123文件下所有图片,获取每张图片左右对撑线左边的图片,将其水平翻转,复制到图片的右侧,另存在234文件夹下。


from PIL import Image
import os
from PIL import Image
import os

# 获取123文件夹下的所有图片文件
def get_image_files(folder):
    return [f for f in os.listdir(folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

# 处理图片并保存到234文件夹
def process_images(src_folder, dst_folder):
    image_files = get_image_files(src_folder)
    for file in image_files:
        # 打开图片并获取其大小
        src_img = Image.open(os.path.join(src_folder, file))
        width, height = src_img.size

        # 创建一个新的画布,大小与原图相同,背景颜色设置为白色
        new_img = Image.new('RGB', (width, height), color='white')

        # 将原图的左半部分复制到新画布的左侧
        left_half = src_img.crop((0, 0, width // 2, height))
        new_img.paste(left_half, (0, 0))

        # 将原图的左半部分水平翻转后,复制到新画布的右侧
        flipped_left_half = left_half.transpose(Image.FLIP_LEFT_RIGHT)
        new_img.paste(flipped_left_half, (width // 2, 0))

        # 保存处理后的图片到234文件夹下,文件名保持不变
        new_img.save(os.path.join(dst_folder, file))


input_folder = path+r'\00图片'
output_folder =  path+r'\01对称'

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

process_images(input_folder, output_folder)



print('-----3、正面花瓶中间插入对折线,反面花瓶找到各个坐标点,制作裁剪线和折线------------')

from PIL import Image, ImageDraw
import os

def find_non_white_coordinates(image):
    width, height = image.size
    top_y = None
    bottom_y = None

    for y in range(height):
        for x in range(width):
            r, g, b = image.getpixel((x, y))
            if r != 255 or g != 255 or b != 255:
                top_y = y
                break
        if top_y is not None:
            break

    for y in range(height - 1, -1, -1):
        for x in range(width):
            r, g, b = image.getpixel((x, y))
            if r != 255 or g != 255 or b != 255:
                bottom_y = y
                break
        if bottom_y is not None:
            break

    return top_y, bottom_y

def find_non_white_x_coordinates(image, y):
    width, height = image.size
    left_x = None
    right_x = None

    for x in range(width):
        r, g, b = image.getpixel((x, y))
        if r != 255 or g != 255 or b != 255:
            left_x = x
            break

    for x in range(width - 1, -1, -1):
        r, g, b = image.getpixel((x, y))
        if r != 255 or g != 255 or b != 255:
            right_x = x
            break

    return left_x, right_x


input_folder = path+r'\01对称'
output_folder2 = path+r'\03虚线'
output_folder =  path+r'\02修图'
if not os.path.exists(output_folder2):
    os.makedirs(output_folder2)

if not os.path.exists(output_folder):
    os.makedirs(output_folder)
# 需要剔除的图片    # 
no=[]  
for file in os.listdir(input_folder):
    if file.endswith(('.png', '.jpg', '.jpeg')):

        # 制作正面花瓶中心折线
        input_file = os.path.join(input_folder, file)
        output_file = os.path.join(output_folder2, file)

        
        image = Image.open(input_file)
        draw = ImageDraw.Draw(image)
  
         # 在新图像上绘制黑色线条
        with Image.open(input_file) as img:
            width, height = img.size
            half_width = width // 2
            # 遍历图像的高度,步长为10。对于每个高度值i,
            for i in range(0, height, 10):
                if i % 40 < 20:
                    # 它检查i是否是40的倍数且小于20。如果是,它将颜色设置为黑色;否则,将颜色设置为白色。
                    color = (150, 150, 150)
                else:
                    color = (255, 255, 255)
                # 它在图像的中间位置(half_width)上下各偏移1个像素的位置绘制一条宽度为10的线段。这样,每隔40个像素,线段的颜色就会在黑色和白色之间交替变化。
                draw.line([(half_width - 1, i), (half_width + 1, i)], fill=color, width=10)

        # 保存处理后的图像
        image.save(output_file)

        # 制作背面花瓶中心折线和虚线、实现
        input_file = os.path.join(input_folder, file)
        output_file = os.path.join(output_folder, file)


        image = Image.open(input_file)
        draw = ImageDraw.Draw(image)
             # 顶部黑色坐标和底部黑色坐标
        top_y, bottom_y = find_non_white_coordinates(image)

         # 创建一个新的空白图像
        new_image = Image.new('RGB', image.size, (255, 255, 255))
        new_draw = ImageDraw.Draw(new_image)
        # 顶部坐标和底部坐标向内移动10像素
        top_y +=10
        bottom_y -=10

        if top_y is not None and bottom_y is not None:
            # 计算距离和分割点数
            distance = bottom_y - top_y
            segment_count = num
            segment_length = distance // segment_count
            print('s',segment_length)
            
            
            long=[]
            left=[]
            right=[]
            Y=[]
            # 画10条线段
            # n=0
            for i in range(segment_count + 1):
                
                y = top_y + i * segment_length
                # print(y)
                left_x, right_x = find_non_white_x_coordinates(image, y)

                if left_x is not None and right_x is not None:
                    new_draw.line([(left_x, y), (right_x, y)], fill='black', width=5)
                left.append(left_x)
                right.append(right_x)

                length = right_x - left_x
                # print(length)
                long.append(length)
                Y.append(y)
            print('long',long)
            print('left',left)
            print('right',right)
            print('Y',y)

            
            # 如果线段长度小于10像素,就放弃这张图
            for x in long:
                if int(x)<50:
                    print('不和规范的图片:'+file)
                    no.append(file)
            

            # 制作虚线折线
            for y in range(len(long)-1):   
                # 起始数字不能是0,否则虚线会超出顶部和底部            
                for i in range(8, segment_length, 8):
                    if i % 25 < 20:
                        color = (0, 0, 0)
                    else:
                        color = (255, 255, 255)
                    new_draw.line([(left[y]+1, Y[y]+i), (left[y]-1, Y[y]+i)], fill=color, width=10)
                    new_draw.line([(right[y]+1, Y[y]+i), (right[y]-1, Y[y]+i)], fill=color, width=10)
            
            # 如果第二条线比第1条线细,就延长到上面一条线的长度
            for z in range(len(long)-1):    
                if long[z]>long[z+1]:
                   
                    new_draw.line([(left[z], Y[z+1]), (right[z], Y[z+1])], fill='black', width=5)

                  
                    
                
                # 如果第1条线段长于第2条:从第1条线段的左侧右侧向下延伸 segment_length像素,画一条线段
                # 获取坐标点,画一条实线,
                # 如果第2条线段短于第3条,从第3条线段的左侧右侧向上延伸 segment_length像素,
                # if long[y]>long[y+1]:
                #     if long[y+1]>long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]-segment_length)], fill='black', width=5) 
                #         else:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]-segment_length)], fill='black', width=5) 
                #     if long[y+1]<long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5)   
                #         else:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5)     
                # if long[y]<long[y+1]:
                #     if long[y+1]>long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y], Y[y]), (left[y], Y[y]-segment_length)], fill='black', width=5)
                #         else:
                #             new_draw.line([(left[y], Y[y]), (left[y], Y[y]-segment_length)], fill='black', width=5)
                #     if long[y+1]<long[y+2]:
                #         if long[y]>long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5)   
                #         if long[y]<long[y+2]:
                #             new_draw.line([(left[y+1], Y[y+1]), (left[y+1], Y[y+1]+segment_length)], fill='black', width=5) 
                 
        # 在新图像上绘制黑色线条
        with Image.open(input_file) as img:
            width, height = img.size
            half_width = width // 2
            # 遍历图像的高度,步长为10。对于每个高度值i,
            for i in range(0, height, 10):
                if i % 40 < 20:
                    # 它检查i是否是40的倍数且小于20。如果是,它将颜色设置为黑色;否则,将颜色设置为白色。
                    color = (0, 0, 0)
                else:
                    color = (255, 255, 255)
                # 它在图像的中间位置(half_width)上下各偏移1个像素的位置绘制一条宽度为10的线段。这样,每隔40个像素,线段的颜色就会在黑色和白色之间交替变化。
                new_draw.line([(half_width - 1, i), (half_width + 1, i)], fill=color, width=10)

        # 保存处理后的图像
        new_image.save(output_file)

print(no)
no=list(set(no))

# 将不符合的图片移走
import os
import shutil

source_folder = input_folder
target_folder = path+r'\04选出'

if not os.path.exists(target_folder):
    os.makedirs(target_folder)

for file_name in no:
    
    source_file = os.path.join(source_folder, file_name)
    target_file = os.path.join(target_folder, file_name)
    shutil.move(source_file, target_file)

print("图片已成功移动到目标文件夹。")

# 删选用,第二次要注释
# import shutil
# shutil.rmtree(output_folder) #递归删除文件夹,即:删除非空文件夹



print('----4、制作PDF-----------')


import os
import time
import shutil
from docx import Document
from docx.shared import Cm, Pt, Inches, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from PyPDF2 import PdfFileMerger, PdfFileReader
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from win32com.client import constants, gencache
from win32com.client.gencache import EnsureDispatch
from datetime import datetime
import random
import xlwt
import xlrd
from PyPDF2 import PdfMerger

# import convert

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\青花瓷立体书'

z_folder = path+r'\03虚线'
f_folder = path+r'\02修图'

z_files = [os.path.join(z_folder, f) for f in os.listdir(z_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]
f_files = [os.path.join(f_folder, f) for f in os.listdir(f_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

all=[]
for i in range(len(z_files)):
    all.append(z_files[i])
    all.append(f_files[i])
print(all)

# 创建临时文件夹
new_folder = path+r'\零时文件夹'
os.makedirs(new_folder, exist_ok=True)



for nn in range(0,int(len(all))):      # 读取图片的全路径  的数量 31张
    doc = Document(path+r'\02青花瓶A4.docx')
    table = doc.tables[0]          # 4567(8)行
#
    # 写入1张大图
    run=doc.tables[0].cell(1,0).paragraphs[0].add_run()        # # 图片位置 第一个表格的0 3 插入照片
    run.add_picture(r'{}'.format(all[nn]),width=Cm(10.58),height=Cm(14.1))
    table.cell(1,0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中 
  
    
#     time.sleep(1)

  # 保存修改后的.docx文件
    doc.save(new_folder + fr'\{nn + 1:03d}.docx')
    # docx 文件另存为PDF文件
    inputFile = new_folder + fr'\{nn + 1:03d}.docx'  # 要转换的文件:已存在
    outputFile = new_folder + fr'\{nn + 1:03d}.pdf'  # 要生成的文件:不存在
    convert(inputFile, outputFile)
    time.sleep(2)

pdf_lst = [f for f in os.listdir(new_folder) if f.endswith('.pdf')]
pdf_lst = [os.path.join(new_folder, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfMerger()
for pdf in pdf_lst:
    print(pdf)
    file_merger.append(pdf)
# file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/(打印合集)大班A整页描字帖2乘5加表格-4名字-({}人).pdf".format(num))
file_merger.write(path+fr"\青花瓷立体书{num}条({len(z_files)}人共{len(z_files)}份).pdf")
# 9宫格制作2图任务卡时报错,
# time.sleep(0)
time.sleep(1)
# 01 06图答题卡.pdf
    # 02 06图任务卡.pdf
file_merger.close()


# 删除输出文件夹
shutil.rmtree(new_folder)
# shutil.rmtree(zheng_path)
# shutil.rmtree(fan_path)
time.sleep(1)



实线数量越多,图案约接近原图

切割:20

因为哟123张,共有246张,保存一次时间挺长的。

因为我带的中班,所以我觉得:

1、绘图困难:孩子们画蓝色青花图案也比较困难,最好是正面花瓶里直接有线描图案,幼儿只要涂色即可。后续研究如何把纹样放到花瓶里。

2、因为反面剪切线部分图案与实际花瓶边缘不能完全对上,所以花瓶黑色边缘最好也改成浅蓝色、浅灰色,,万一超出范围,就用蓝色蜡笔重新勾边。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值