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

news2025/2/4 0:56:54

背景需求:

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

🇭🇰香港免费展览|青花瓷立体纸艺观展册📖 - 小红书 (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、因为反面剪切线部分图案与实际花瓶边缘不能完全对上,所以花瓶黑色边缘最好也改成浅蓝色、浅灰色,,万一超出范围,就用蓝色蜡笔重新勾边。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

买卖股票大合集

刷题刷题往死里刷。 121. 买卖股票的最佳时机 链接 121. 买卖股票的最佳时机 思路&#xff1a; 二次做所以有思路了&#xff0c; 从头遍历数组&#xff0c;维持一个最小值&#xff0c;且遇到一个值就计算差值&#xff0c;且维护这个最大值为答案。 class Solution {public …

文心智能体——制作你的专属AI

随着社会的进步和互联网技术的发展&#xff0c;人工智能领域正蓬勃发展。最近几年关于人工智能的新闻日渐增多并且成为了当代最大的热点&#xff0c;所有的领域都在引进AI、训练AI、使用AI&#xff0c;AI正逐步融入人们的生活。从前几年chatGPT大语言模型的横空出世&#xff0c…

【CSDN入门级教程】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Linux进程调度和进程切换

并行&#xff08;Parallel&#xff09; 含义&#xff1a;并行是指多个任务在同一时刻同时执行。 硬件要求&#xff1a;需要多个处理器&#xff08;如多核CPU&#xff09;或者多台计算设备来实现&#xff0c;这些执行单元能够真正地同时处理不同的任务。例如&#xff0c;一个具…

vite学习教程05、vite+vue2构建本地 SVG 图标

文章目录 前言一、构建本地SVG图标详细步骤1、安装开发依赖2、配置vite2.1、配置vite.config.js2.2、封装vite引入插件脚本 解决报错&#xff1a;can not find package fast-glob imported 二、实际应用应用1&#xff1a;未封装&#xff0c;直接vue应用应用2&#xff1a;封装vu…

Self-Operating Computer:基于PyAutoGui加AI实现无人“驾驶“电脑,让Python带你走近未来世界

近年来&#xff0c;AI 领域不断取得突破&#xff0c;特别是多模态模型的出现&#xff0c;为计算机无人操控带来了全新的可能性。 想象一下&#xff0c;你的电脑不再需要你手动操作&#xff0c;而是可以像人一样&#xff0c;理解你的指令&#xff0c;并自动执行一系列鼠标键盘操…

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白

【word脚注】双栏设置word脚注&#xff0c;脚注仅位于左栏&#xff0c;右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前&#xff1a;脚注位于左下角&#xff0c;但右栏与左栏内容对其&#xff0c;未填充右下角的空白区域 解决方法 备份源文件复制脚注内…

MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)

目录 一、前言二、聚合查询2.1 聚合函数2.1.1 COUNT():统计所有行2.1.2 SUM(列名) 求和2.1.3 AVG()2.1.4 MAX()、MIN() 2.2 GROUP BY子句&#xff08;分组查询&#xff09;2.3 HAVING 三、联合查询3.1表的笛卡儿积3.2内连接3.2.1 例题一3.2.2 例题二 3.3外连接3.3.1 右外连接3.…

【每天学个新注解】Day 16 Lombok注解简解(十五)—@FieldNameConstants

FieldNameConstants 根据属性名生成常量类的常量。 1、如何使用 加在需要根据属性名生成常量的属性上。 2、代码示例 例&#xff1a; FieldNameConstants public class Test {private String iAmAField;private int andSoAmI;FieldNameConstants.Exclude private int asA…

Microsoft AI部门的CEO额备忘录

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

kafka-windows集群部署

kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper&#xff0c;kafka集群 前言 部署本文步骤可以先阅读这一篇博客&#xff0c;这篇是关于单机kafka部署测试的。本文用到的文件…

VUE2常见问题以及解决方案汇总(不断更新中)

解决vue项目中 el-table 的 row-click 事件与行内点击事件冲突&#xff0c;点击事件不生效&#xff08;表格行点击事件和行内元素点击事件冲突&#xff09;需要阻止事件冒泡 问题描述 1.点击列的编辑按钮&#xff0c;会触发按钮本身事件&#xff0c;同时会触发行点击事件 2.点…

自用Proteus(8.15)常用元器件图示和功能介绍(持续更新...)

文章目录 一、 前言二、新建工程&#xff08;以51单片机流水灯为例&#xff09;2.1 打开软件2.2 建立新工程2.3 创建原理图2.4 不创建PCB布版设计2.5 创建成功2.6 添加元器件2.7 原理图放置完成2.8 编写程序&#xff0c;进行仿真2.9 仿真 三、常用元器件图示和功能介绍3.1 元件…

春秋云镜靶场之CVE-2022-28525

1.环境搭建 我们开启环境 可以看到题目提示我们是文件上传漏洞&#xff0c;那么我们就进行测试 2.开启环境 我们开启环境&#xff0c;可以看到是一个登录页面&#xff0c;登录页面:一种是弱口令&#xff0c;一种是自己进行注册&#xff0c;一种是SQL注入&#xff0c;一种是在…

【rCore OS 开源操作系统】Rust 异常处理

【rCore OS 开源操作系统】Rust 异常处理 前言 虽然人还在旅游ing&#xff0c;但是学习不能停止&#xff0c;所以还是写点博客记录下。 对于 Rust 的异常处理&#xff0c;我的感受是&#xff1a;晦涩难懂&#xff0c;繁琐难记。 但是没办法&#xff0c;正如一位故人所说的&…

算法 | 位运算(哈希思想)

位运算 &与两个位都为1时&#xff0c;结果才为1&#xff08;有0为0&#xff09;|或两个位都为0时&#xff0c;结果才为0&#xff08;有1为1&#xff09;^异或两个位相同为0&#xff0c;相异为1~取反0变1&#xff0c;1变0<<左移各二进位全部左移若干位&#xff0c;高…

【FPGA开发】Modelsim如何给信号分组

前面已经发布过了一篇关于 Modelsim 的入门使用教程&#xff0c;针对的基本是只有一个源文件加一个仿真tb文件的情况&#xff0c;而实际的工程应用中&#xff0c;往往是顶层加多个底层的源文件结构&#xff0c;如果不对信号进行一定的分组&#xff0c;就会显得杂乱不堪&#xf…

LSM6DSV16X基于MLC智能笔动作识别(4)----中断获取智能笔状态

LSM6DSV16X基于MLC智能笔动作识别.4--中断获取智能笔状态 概述视频教学样品申请源码下载硬件准备开启INT中断参考驱动程序配置中断主程序演示 概述 LSM6DSV16X 支持通过中断&#xff08;INT&#xff09;输出 MLC&#xff08;机器学习核&#xff09;识别的动作。具体来说&#…

YOLOv8改进线性注意力模块 ICCV2023 FLatten Transformer

1,原理部分 论文地址:2308.00442 (arxiv.org) 在将 Transformer 模型应用于视觉任务时,自我注意的二次计算复杂性一直是一个持续的挑战。另一方面,线性注意力通过精心设计的映射函数近似 Softmax 操作,通过其线性复杂性提供了一种更有效的替代方案。然而,当前的线性注意…

手机sd卡数据被清空怎么恢复原状?高效、可行的恢复策略

在数字化时代&#xff0c;手机SD卡作为我们存储重要数据的“数字仓库”&#xff0c;其安全性与稳定性直接关系到我们日常生活的便捷与信息安全。然而&#xff0c;不慎操作或系统故障导致的SD卡数据清空&#xff0c;常常让人措手不及&#xff0c;焦虑万分。面对这一挑战&#xf…