当前位置: 首页 > article >正文

【教学类-82-01】20241209涂色手表制作1.0(表盘、表带)

背景需求

我想模仿制作小红书里面的一款手表

【原创】纸质涂色手表|儿童益智手工|可打印 - 小红书今天陪孩子玩什么? 无论在幼儿园还是在家,大家都在寻找简单有趣的陪娃神器。 🎨那么今天跟WECOLOR一起动手完成一块充满乐趣和创意的手表吧! 💫制作过程简单又有趣,家长们可以和孩子们一起动手,享受亲子时光的同时,也能培养孩子的创造力和动手能力。选择孩子们喜欢的颜色,指导他们轻轻描绘在表盘上,让每一个细节都充满爱与温馨~ 📝需要材料: ①WECOLOR打印图 ②彩笔 ③剪刀 ④胶水 👶🏻适合年龄:3+ 🙌🏻制作难度:🔴⭕⭕⭕⭕ 🌈对于每一个孩子来说,色彩都是他们非常亲密的伙伴。着色时钟,让孩子们在动手中感受色彩的魅力,激发他们的想象力和创造力。 🥰快来动手试试吧!让每一分每一秒都充满个性和创意! #幼儿园手工 #幼师 #幼儿园环创可打印素材 #亲子手工 #儿童美术 #儿童美育 #涂色 #儿童专注力训练 #亲子时光 #益智早教icon-default.png?t=O83Ahttps://www.xiaohongshu.com/discovery/item/664822b7000000001303d65d?app_platform=android&ignoreEngage=true&app_version=8.64.0&share_from_user_hidden=true&xsec_source=app_share&type=normal¬eAttributes=goods&xsec_token=CBSxwUIKO5tRKfaiWn9VFfN4pRNBskTdAhQG6BDxrXg0I=&author_share=1&xhsshare=WeixinSession&shareRedId=ODszMTs4Nk82NzUyOTgwNjg3OTlHS0xC&apptime=1733751344&share_id=dd8fc39c1bdd4f3d94ff0f6aec65922e

但是中班幼儿的手腕很细,我不能确定这款手表的黏贴(固定黏贴位置)出来的圆圈正好适合每一位中班幼儿的手腕直径

直径大了容易在手腕上松动,直径小了幼儿不能脱下来

所以我想用雌雄扣来制作可脱式手表,考虑用AI生成图片花纹,用Python批量设计不同图案的手表造型并批量制作A4打印纸。

一、获取表盘花纹

板式:万相1.0

关键词:正圆形花纹,几何花纹,没有空心,简单笔画,卡通,黑白,未着色,幼儿插图,线条画,没有背景,没有颜色,黑白漫画线条艺术:,空背景,细轮廓,清晰的线条,矢量线。简单,大,

尺寸  1:1

二、获取表带花纹

板式:万相2.0

关键词:爱心图案纹理纸,简单笔画,卡通,黑白,未着色,幼儿插图,线条画,没有背景,没有颜色,黑白漫画线条艺术:,细轮廓,清晰的线条,矢量线。简单,大,

尺寸  9:16

几何图案纹理纸

空心圆图案纹理纸

大小空心圆图案纹理纸

大小爱心图案,纹理纸

用0.8-0.9,可以生成密集图案

大小空心圆图案,纹理纸

大小三角形图案

大小正方形图案大小水滴形图案

祥云纹图案

水波纹图案

指纹图案

点线面图案

花了三天时间,随机下载了许多图片,目测只有一半图片可以用,

制作不同大小的表盘

# 3.89*2*5条
'''
手表的表盘
星火讯飞、阿夏
202401208
'''


import os
from PIL import Image, ImageDraw



print('----1、切掉上下左右的白色图层------')

import os
from PIL import Image

import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReader

from PIL import Image, ImageDraw, ImageFont
import os,random

path=r'D:\20241204手表表皮表盘'
path1=path+r'\02表盘'
folder_path = path1+r'\01白色'

# 留一点白边
white_edge=0
# C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料甜甜圈\甜甜圈白色
import os
from PIL import Image

def find_non_white_pixel(image):
    width, height = image.size
    left, right, top, bottom = width, 0, height, 0

    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:
                if x < left:
                    left = x
                if x > right:
                    right = x
                if y < top:
                    top = y
                if y > bottom:
                    bottom = y

    return left, right, top, bottom

def crop_image(image, left, right, top, bottom):
    return image.crop((left-white_edge, top-white_edge, right + white_edge, bottom + white_edge))



output_folder = path1+r'\02切边图'
os.makedirs(output_folder, exist_ok=True)


for file_name in os.listdir(folder_path):
    if file_name.endswith(".jpg") or file_name.endswith(".png"):
        input_path = os.path.join(folder_path, file_name)
        image = Image.open(input_path)
        left, right, top, bottom = find_non_white_pixel(image)
        cropped_image = crop_image(image, left, right, top, bottom)
        output_path = os.path.join(output_folder, file_name)
        cropped_image.save(output_path)



'''
去边后白色地方变成透明色,透明图片统一大小
星火讯飞、阿夏
20240817
'''      

print('----2、图片放大成为1024*1024------')
import os
from PIL import Image

# path=r'C:\Users\jg2yXRZ\OneDrive\图片\20240817饮料圆形'
# input_folder = path+r'\圆形切边图'
# output_folder = path+r'\圆形切边图透明'


# input_folder = path+r'\05切边图'
output_folder =path1+r'\02切边图'
# output_folder = path+r'\04透明图'
newput_folder =path1+r'\03统一图'
os.makedirs(newput_folder,exist_ok=True)

# 提取最大宽度的那张图片的尺寸
def get_max_width_and_height(fold_path):
    max_width = 0
    max_height = 0

    for file_name in os.listdir(fold_path):
        if file_name.endswith(".png") or file_name.endswith(".jpg") or file_name.endswith(".jpeg"):
            file_path = os.path.join(fold_path, file_name)
            img = Image.open(file_path)
            width, height = img.size
            if width > max_width:
                max_width = width
                max_height = height

    return max_width, max_height

fold_path = output_folder
max_width, max_height = get_max_width_and_height(fold_path)
print("最大宽度:", max_width)
print("最大高度:", max_height)

# 最大宽度: 1023
最大高度: 1021

# # 自定义长宽
# max_width=622
# max_height=877

# 统一所有图片大小
def resize_image(image_path, output_folder, new_image_name):
    img = Image.open(image_path)
    new_img = img.resize((max_width,max_height))
    new_img.save(os.path.join(output_folder, new_image_name))


for file in os.listdir(output_folder):
    if file.endswith('.png'):
        input_image_path = os.path.join(output_folder, file)
        new_image_name = f"{file[:-4]}.png"
        resize_image(input_image_path, newput_folder, new_image_name)



print('-制作内部的白色圆盘')
from PIL import Image, ImageDraw
import os,math

指定图片所在的文件夹路径
folder_path = newput_folder

# 确保输出文件夹存在
output_folder = path1+r'\05数字盘'
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
    if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
        image_path = os.path.join(folder_path, filename)
        
        # 打开图片
        with Image.open(image_path) as img:
            width, height = img.size
            center_x, center_y = width // 2, height // 2
            radius = 400
            radius2 = radius-35
            radius3 = radius-25
            line_width = 10
            line_width1 = 5
            text_distance = 310  # 距离圆心的距离为100磅
            font_size = 100  # 字体大小可以根据需要调整
            
            # 创建一个可以在给定图像上绘图的对象
            draw = ImageDraw.Draw(img)
            
            # 画圆(先画填充部分)
            draw.ellipse((center_x - radius, center_y - radius, center_x + radius, center_y + radius), fill='white')
            
            # 画圆(再画边框部分)
            draw.ellipse((center_x - radius, center_y - radius, center_x + radius, center_y + radius), outline='black', width=line_width)
            
            
             # 放射状画60条线条,黑色10磅,角度30度(秒)
            for i in range(60):
                angle = math.radians(i * 6)  # 将角度转换为弧度
                start_point = (center_x, center_y)
                end_point = (center_x + radius * math.cos(angle), center_y - radius * math.sin(angle))
                draw.line([start_point, end_point], fill='black', width=line_width1)

            # 画圆(先画填充部分)
            draw.ellipse((center_x - radius3, center_y - radius3, center_x + radius3, center_y + radius3), fill='white')

            # 放射状画12条线条,黑色10磅,角度30度(分)
            for i in range(12):
                angle = math.radians(i * 30)  # 将角度转换为弧度
                start_point = (center_x, center_y)
                end_point = (center_x + radius * math.cos(angle), center_y - radius * math.sin(angle))
                draw.line([start_point, end_point], fill='black', width=line_width)

            # 画圆(先画填充部分)
            draw.ellipse((center_x - radius2, center_y - radius2, center_x + radius2, center_y + radius2), fill='white')
            # 在中心点上画一个直径为10的黑色圆形
            small_radius = 20  # 半径为5,直径为10
            draw.ellipse((center_x - small_radius, center_y - small_radius, center_x + small_radius, center_y + small_radius), fill='black')

            # 加载字体
            font = ImageFont.truetype("arial.ttf", font_size)
            
            # 计算文本位置
            text_position_90 = (center_x + text_distance, center_y)
            text_position_180 = (center_x, center_y + text_distance)
            
            # 每隔30度写一个数字(1-12)
            for i in range(12):
                angle = math.radians(60+i * -30)  # 将角度转换为弧度,
                text_position = (center_x + text_distance * math.cos(angle), center_y - text_distance * math.sin(angle))
                draw.text(text_position, str(i + 1), fill="gray", font=font, anchor="mm")

           


            # 保存修改后的图片
            img.save(os.path.join(output_folder, os.path.basename(image_path)))


# 表盘图片导入docx
import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReader

from PIL import Image, ImageDraw, ImageFont
import os,random


# t=9
# 正方尺寸
m=['19.6','14.1','9.8','9.04','7.04','6.55','5.63','4.69','3.92','3.27','2.33']
# 格子数量
n=['1','2','4','6','8','12','15','24','35','48','96']
# 格子数
tt=[1,1,2,2,2,3,3,4,5,6,8]

for x in range(len(m)):

    # 获取文件夹下的所有图片文件
    image_files = [os.path.join(output_folder, f) for f in os.listdir(output_folder) if f.endswith(('.jpg', '.jpeg', '.png'))]
    print(image_files)
    print(len(image_files))
    # 52

    # 将图片拆成14个一组
    grouped_files = [image_files[i:i + int(n[x])] for i in range(0, len(image_files), int(n[x]))]
    # grouped_files = [image_files[i:i + t*5] for i in range(0, len(image_files), t*5)]
    print(len(grouped_files))

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

    print('----3、插入docx,制作pdf------------')
    # 处理每一组图片
    for group_index, group in enumerate(grouped_files):
        # 创建新的Word文档
        doc = Document(path+fr'\表盘{m[x]}CM {n[x]}条.docx')
        # print(group)
        
        # 遍历每个单元格,并插入图片
        for i in range(1):
            for cell_index, image_file in enumerate(group):
                # 计算图片长宽(单位:厘米)
            
            # 如果是空格,就跳过
                if not image_file:
                    continue
            
                # 插入图片到单元格
                table = doc.tables[0]
                cell = table.cell(int(cell_index / int(tt[x])), cell_index % int(tt[x]))
                # 如果第一行有2个格子,两个数字都写2
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run()
                run.add_picture(image_file, width=Cm(float(m[x])), height=Cm(float(m[x])))
                # run.add_picture(image_file, width=Cm(2), height=Cm(3.89))
                # 3.89
            
        # 保存Word文档
        doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
        
    
    # 将10个docx转为PDF
    import os
    from docx2pdf import convert
    from PyPDF2 import PdfFileMerger
    
    pdf_output_path = path+fr'\{x+1:02}表盘{m[x]}CM_{n[x]}条_共{len(image_files)}图共{len(grouped_files)}页.pdf'
    # _{(len(grouped_files))}图共{int(len(image_files)/n[x])}页.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'))
            time.sleep(5)


    # 合并零时文件里所有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(60)

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


    # 删除输出文件夹

    shutil.rmtree(new_folder)
    time.sleep(20)

1、原始(下载的图片)每张1.43MB

2、白色(uibot +PS 把背景白色统一调整255,255,255白色)每张1.43MB

3、切边图(把圆盘放到最大,没有白边)约500KB,每张大小不同,

4、统一图(最大的一张图片是1023*1021,把每张图片都调整成1023*1021)

虽然大小KB不同,但是尺寸长宽都是1023*1021。

5、05数字盘,在图片上添加白色填充圆,再添加细线刻度线,、添加白色填充圆,添加整数刻度线,添加白色填充圆,添加12个灰色数字,添加中心的圆

获取大量的花边数字表盘后,就可以写入到不同大小的word模板的单元格里。

表盘都是圆形图案,适配11种不同大小的正方形单元格,没有问题

二、表带

首先,我把所有的图片下载,预先删除了一些画面没有铺满的图案,

用代码先制作了一套“带环”的3CM的手表带

所以要获取所有的3合并手表带图片,然后人工删除连接部分图案差异明显的图片。

原图有292张

人工删除后只有100张


'''
Python,读取1文件夹和2文件夹中的文件名称,找出1文件夹里存在,但2文件夹里不存在的图片名称,把1文件夹里的这些图片转移到3文件夹里。
星火讯飞
20241209
'''
import os
import shutil

path=r'D:\20241204手表表皮表盘\01表带'
# 设置文件夹路径
folder1 = path+r'\01原图'
folder2 = path+r'\02手表环'
folder3 = path+r'\04不适合'

# 获取两个文件夹中的文件列表
files_in_folder1 = set(os.listdir(folder1))
files_in_folder2 = set(os.listdir(folder2))

# 找出在folder1中但不在folder2中的文件
unique_files = files_in_folder1 - files_in_folder2

# 创建目标文件夹如果它不存在
if not os.path.exists(folder3):
    os.makedirs(folder3)

# 将独特的文件从folder1移动到folder3
for file in unique_files:
    src_path = os.path.join(folder1, file)
    dst_path = os.path.join(folder3, file)
    shutil.move(src_path, dst_path)
    print(f"Moved {file} to {folder3}")

print("File transfer complete.")

最后原图文件里也只有100个

多余的转到了“不适合”文件夹192张

然后就开始用不同的模版,制作手表带

2CM 细表带代码,

# 3.89*2*5条
'''
表带2CM
星火讯飞、阿夏
2024年8月4日
'''


import os
from PIL import Image, ImageDraw

print('----1、房屋切割成左右对称两片------------')

path=r'D:\20241204手表表皮表盘'
folder_path=path+r'\01表带\01原图'
t=14

import os
from PIL import Image


# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
    # 检查文件是否为图片
    if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
        # 拼接完整的文件路径
        file_path = os.path.join(folder_path, filename)
        
        # 打开图片
        with Image.open(file_path) as img:
            # 获取图片的宽度和高度
            width, height = img.size
            print(f"{filename}:宽 = {width}, 长 = {height}")
# 720, 1280

# 设置文件夹路径

output_folder = path+r'\01表带\02手表带'
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
    # 检查文件是否为图片
    if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
        # 拼接完整的文件路径
        file_path = os.path.join(folder_path, filename)
        
        # 打开图片
        with Image.open(file_path) as img:
            # 获取图片的宽度和高度
            original_width, original_height = img.size
            
            # 创建一个新的空白图片,宽度不变,高度为原图的两倍
            new_width = original_width
            new_height = original_height * 3
            new_img = Image.new('RGB', (new_width, new_height), color='white')
            
            # 在0,0和0,高度的一半位置插入两次原图
            top_position = (0, 0)
            middle_position = (0,  original_height)
            three_position = (0,  original_height*2)
            
            new_img.paste(img, top_position)
            new_img.paste(img, middle_position)
            new_img.paste(img, three_position)

            # 画表盘圆
            # 找到新图片的中心点
            center_x = new_width // 2
            center_y = new_height // 2
            
            # 计算圆的边界框
            circle_radius = 360
            left = center_x - circle_radius
            top = center_y - circle_radius
            right = center_x + circle_radius
            bottom = center_y + circle_radius
            
            # 创建一个绘图对象
            draw = ImageDraw.Draw(new_img)
            
            # 画一个直径为10磅的白色填充黑色5磅边框的圆形
            draw.ellipse([left, top, right, bottom], outline='black', width=10, fill='white')

              # 画线    
            # 设置虚线样式,每段2磅黑线和2磅空白交替出现
            
            dash_length = 40
            space_length = 30

            # 获取top和bottom的值
            tt=[]
            tt.append(top)
            tt.append(bottom)

            # 定义起始点和结束点            
            for hh in tt:
                start_point = (original_width/6,top)
                end_point = (original_width/6*5,top)
                start_point = (original_width/6,hh)
                end_point = (original_width/6*5,hh)

                # 计算总长度
                total_length = end_point[0] - start_point[0]
                # 绘制虚线
                current_x = start_point[0]
                while current_x < end_point[0]:
                    next_x = min(current_x + dash_length, end_point[0])
                    draw.line([(current_x, start_point[1]), (next_x, start_point[1])], fill='black', width=10)
                    current_x += dash_length + space_length
                # draw.line([ (original_width/6,top), (original_width/6*5,top)], fill='black', width=2,dashes=dash_pattern)
            
            #  # 画黑色线框
            # square_top_left = (original_width/6,original_width/2-10)
            # square_bottom_right = (original_width-original_width/6,new_height*3)
            # draw.rectangle([square_top_left, square_bottom_right], outline='black', width=10)

            # # 画左右两边的白色
            # # 画一个高为new_height,宽为150磅的白色正方形
            # square_top_left = (0,original_width/2)
            # square_bottom_right = (original_width/6, new_height*3)
            # draw.rectangle([square_top_left, square_bottom_right], fill='white')


            #  # 画一个高为new_height,宽为150磅的白色正方形
            # # square_top_left = (original_width-original_width/6,0)
            # square_top_left = (original_width-original_width/6,original_width/2)
            # square_bottom_right = (original_width,new_height*3)
            # draw.rectangle([square_top_left, square_bottom_right], fill='white')


           
            # 找到新图片的中心点
            center_x1 = new_width // 2
            for xx in [1400,600]:
                # 数字越大,离中心圆越远(靠近环) 上数字,下数字
                center_y1 = new_height // 2-xx
                
                # 计算圆的边界框
                circle_radius1 = 100
                left1 = center_x1 - circle_radius1
                top1 = center_y1 - circle_radius1
                right1 = center_x1 + circle_radius1
                bottom1 = center_y1 + circle_radius1

                # 在坐标上画圆圈
                # 画一个直径为10磅的白色填充黑色5磅边框的圆形
                draw.ellipse([left1, top1, right1, bottom1], outline='black', width=20, fill='white')

                #  # 在圆圈内填充1像素的小圆点
                # for i in range(10):
                #     for j in range(10):
                #         draw.point((95 + i, 95 + j), fill='black')       

            # 画一个直径为10磅的白色填充黑色5磅边框的圆形
             # 画一个高为new_height,宽为150磅的白色正方形
            square1= (0,0)
            square2 = (original_width,original_width/2)
            draw.rectangle([square1, square2], outline='black', width=10, fill='white')
            # fill='white'

            #  # 画一个高为new_height,宽为150磅的白色正方形
            # square1= (original_width/6,original_width/6)
            # square2 = (original_width/6*5,original_width/6*2)
            # draw.rectangle([square1, square2], outline='black', width=10, fill='white')

            
              # 在三个点坐标上画一个左三角形,白色填充
            triangle_points = [(0, new_height), (0,new_height/6*4), (center_x-circle_radius1*2,new_height)]
            draw.polygon(triangle_points, fill='white')
            # 画线
            draw.line([ (0,new_height/6*4), (center_x-circle_radius1*2,new_height)], fill='black', width=10)


            # 在三个点坐标上画一个左三角形,白色填充
            triangle_points = [(original_width, new_height), (original_width,new_height/6*4), (center_x+circle_radius1*2,new_height)]
            draw.polygon(triangle_points, fill='white')
            # 画线
            draw.line([ (original_width,new_height/6*4), (center_x+circle_radius1*2,new_height)], fill='black', width=10)
            # 在斜线上画黑线

            # 另存为新文件
            new_filename = f"{os.path.splitext(filename)[0]}.png"
            new_file_path = os.path.join(output_folder, new_filename)
            new_img.save(new_file_path)
            print(f"Saved {new_file_path}")

# 合并图案

import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReader

from PIL import Image, ImageDraw, ImageFont
import os,random

# 获取文件夹下的所有图片文件
image_files = [os.path.join(output_folder, f) for f in os.listdir(output_folder) if f.endswith(('.jpg', '.jpeg', '.png'))]
print(image_files)

# image_files=[]
# for a in range(len(image_file)):    
#     for _ in range(1):  # 每个图片复制5次
#         image_files.append(image_file[a])
#     # image_files.append('')
# print(image_files)
# print(len(image_files))


# 将图片拆成14个一组
grouped_files = [image_files[i:i + t] for i in range(0, len(image_files), t)]
# grouped_files = [image_files[i:i + t*5] for i in range(0, len(image_files), t*5)]
print(len(grouped_files))

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

print('----3、插入docx,制作pdf------------')
# 处理每一组图片
for group_index, group in enumerate(grouped_files):
    # 创建新的Word文档
    doc = Document(path+fr'\表带2CM{t}条.docx')
    # print(group)
    
    # 遍历每个单元格,并插入图片
    for i in range(1):
        for cell_index, image_file in enumerate(group):
            # 计算图片长宽(单位:厘米)
        
        # 如果是空格,就跳过
            if not image_file:
                continue
        
            # 插入图片到单元格
            table = doc.tables[0]
            cell = table.cell(int(cell_index / t), cell_index % t)
            # 如果第一行有2个格子,两个数字都写2
            cell_paragraph = cell.paragraphs[0]
            cell_paragraph.clear()
            run = cell_paragraph.add_run()
            run.add_picture(image_file, width=Cm(2), height=Cm(19.54))
            # run.add_picture(image_file, width=Cm(2), height=Cm(3.89))
            # 3.89
        
    # 保存Word文档
    doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
    
import os
from docx import Document
from docx.shared import Cm


t = 14  # 每组图片的数量
grouped_files = [image_files[i:i + t] for i in range(0, len(image_files), t)]
print(len(grouped_files))

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

print('----3、插入docx,制作pdf------------')
# 处理每一组图片
for group_index, group in enumerate(grouped_files):
    # 创建新的Word文档
    doc = Document(path + fr'\表带2CM{t}条.docx')
    
    # 获取表格对象
    table = doc.tables[0]
    
    # 遍历每个单元格,并插入图片
    cell_index = 0
    for row in table.rows:
        for cell in row.cells:
            if cell_index < len(group):
                image_file = group[cell_index]
                if image_file:
                    cell_paragraph = cell.paragraphs[0]
                    cell_paragraph.clear()
                    run = cell_paragraph.add_run()
                    run.add_picture(image_file, width=Cm(2), height=Cm(19.54))
                cell_index += 1
            elif cell_index >= len(group):
                break
    
    # 保存Word文档
    doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))

# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMerger
# pdf_output_path = path+fr'\\01表带{int(len(grouped_files))}张共{int(len(image_files)/2)}图3.89五条.pdf'
# pdf_output_path = path+fr'\\01表带{int(len(grouped_files))}张共{int(len(image_files)/2)}图19.45.pdf'
pdf_output_path = path+fr'\\01表带2CM{t}条{(len(grouped_files))}张共{int(len(image_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'))
        time.sleep(5)


# 合并零时文件里所有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(5)

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


# 删除输出文件夹

shutil.rmtree(new_folder)
time.sleep(2)

作品展示

3.12CM 粗表带代码,

# 3.89*2*5条
'''
表带3.12CM9条
星火讯飞、阿夏
2024年12月09日
'''


import os
from PIL import Image, ImageDraw

print('----1、房屋切割成左右对称两片------------')

path=r'D:\20241204手表表皮表盘'
folder_path=path+r'\01表带\01原图'
t=9

import os
from PIL import Image


# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
    # 检查文件是否为图片
    if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
        # 拼接完整的文件路径
        file_path = os.path.join(folder_path, filename)
        
        # 打开图片
        with Image.open(file_path) as img:
            # 获取图片的宽度和高度
            width, height = img.size
            print(f"{filename}:宽 = {width}, 长 = {height}")
# 720, 1280

# 设置文件夹路径

output_folder = path+r'\01表带\02手表环'
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
    # 检查文件是否为图片
    if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
        # 拼接完整的文件路径
        file_path = os.path.join(folder_path, filename)
        
        # 打开图片
        with Image.open(file_path) as img:
            # 获取图片的宽度和高度
            original_width, original_height = img.size
            
            # 创建一个新的空白图片,宽度不变,高度为原图的两倍
            new_width = original_width
            new_height = original_height * 3
            new_img = Image.new('RGB', (new_width, new_height), color='white')
            
            # 在0,0和0,高度的一半位置插入两次原图
            top_position = (0, 0)
            middle_position = (0,  original_height)
            three_position = (0,  original_height*2)
            
            new_img.paste(img, top_position)
            new_img.paste(img, middle_position)
            new_img.paste(img, three_position)

            # 画表盘圆
            # 找到新图片的中心点
            center_x = new_width // 2
            center_y = new_height // 2
            
            # 计算圆的边界框
            circle_radius = 360
            left = center_x - circle_radius
            top = center_y - circle_radius
            right = center_x + circle_radius
            bottom = center_y + circle_radius
            
            # 创建一个绘图对象
            draw = ImageDraw.Draw(new_img)
            
            # 画一个直径为10磅的白色填充黑色5磅边框的圆形
            draw.ellipse([left, top, right, bottom], outline='black', width=10, fill='white')

             # 画线    
            # 设置虚线样式,每段2磅黑线和2磅空白交替出现
            
            dash_length = 40
            space_length = 30

            # 获取top和bottom的值
            tt=[]
            tt.append(top)
            tt.append(bottom)

            # 定义起始点和结束点            
            for hh in tt:
                start_point = (original_width/6,top)
                end_point = (original_width/6*5,top)
                start_point = (original_width/6,hh)
                end_point = (original_width/6*5,hh)

                # 计算总长度
                total_length = end_point[0] - start_point[0]
                # 绘制虚线
                current_x = start_point[0]
                while current_x < end_point[0]:
                    next_x = min(current_x + dash_length, end_point[0])
                    draw.line([(current_x, start_point[1]), (next_x, start_point[1])], fill='black', width=10)
                    current_x += dash_length + space_length
                # draw.line([ (original_width/6,top), (original_width/6*5,top)], fill='black', width=2,dashes=dash_pattern)
                
             # 画黑色线框
            square_top_left = (original_width/6,original_width/2-10)
            square_bottom_right = (original_width-original_width/6,new_height*3)
            draw.rectangle([square_top_left, square_bottom_right], outline='black', width=10)

            # 画左右两边的白色
            # 画一个高为new_height,宽为150磅的白色正方形
            square_top_left = (0,original_width/2)
            square_bottom_right = (original_width/6, new_height*3)
            draw.rectangle([square_top_left, square_bottom_right], fill='white')


             # 画一个高为new_height,宽为150磅的白色正方形
            # square_top_left = (original_width-original_width/6,0)
            square_top_left = (original_width-original_width/6,original_width/2)
            square_bottom_right = (original_width,new_height*3)
            draw.rectangle([square_top_left, square_bottom_right], fill='white')


             # 画表盘圆
            # 找到新图片的中心点
            center_x1 = new_width // 2
            for xx in [1400,600]:
                # 数字越大,离中心圆越远(靠近环) 上数字,下数字
                center_y1 = new_height // 2-xx
                
                # 计算圆的边界框
                circle_radius1 = 100
                left1 = center_x1 - circle_radius1
                top1 = center_y1 - circle_radius1
                right1 = center_x1 + circle_radius1
                bottom1 = center_y1 + circle_radius1

                # 在坐标上画圆圈
                # 画一个直径为10磅的白色填充黑色5磅边框的圆形
                draw.ellipse([left1, top1, right1, bottom1], outline='black', width=20, fill='white')

                #  # 在圆圈内填充1像素的小圆点
                # for i in range(10):
                #     for j in range(10):
                #         draw.point((95 + i, 95 + j), fill='black')       

            # 画一个直径为10磅的白色填充黑色5磅边框的圆形
             # 画一个高为new_height,宽为150磅的白色正方形
            square1= (0,0)
            square2 = (original_width,original_width/2)
            draw.rectangle([square1, square2], outline='black', width=10, )
            # fill='white'

             # 画一个高为new_height,宽为150磅的白色正方形
            square1= (original_width/6,original_width/6)
            square2 = (original_width/6*5,original_width/6*2)
            draw.rectangle([square1, square2], outline='black', width=10, fill='white')

            
              # 在三个点坐标上画一个左三角形,白色填充
            triangle_points = [(original_width/6, new_height), (original_width/6,new_height/6*4), (center_x-circle_radius1*2,new_height)]
            draw.polygon(triangle_points, fill='white')
            # 画线
            draw.line([ (original_width/6,new_height/6*4), (center_x-circle_radius1*2,new_height)], fill='black', width=10)


            # 在三个点坐标上画一个左三角形,白色填充
            triangle_points = [(original_width/6*5, new_height), (original_width/6*5,new_height/6*4), (center_x+circle_radius1*2,new_height)]
            draw.polygon(triangle_points, fill='white')
            # 画线
            draw.line([ (original_width/6*5,new_height/6*4), (center_x+circle_radius1*2,new_height)], fill='black', width=10)
            # 在斜线上画黑线

            # 另存为新文件
            new_filename = f"{os.path.splitext(filename)[0]}.png"
            new_file_path = os.path.join(output_folder, new_filename)
            new_img.save(new_file_path)
            print(f"Saved {new_file_path}")

# 合并图案

import os,time
import shutil
from docx import Document
from docx.shared import Cm
from PIL import Image
from PyPDF2 import PdfFileMerger, PdfFileReader

from PIL import Image, ImageDraw, ImageFont
import os,random

# 获取文件夹下的所有图片文件
image_files = [os.path.join(output_folder, f) for f in os.listdir(output_folder) if f.endswith(('.jpg', '.jpeg', '.png'))]
print(image_files)
print(len(image_files))
# 9
# image_files=[]
# for a in range(len(image_file)):    
#     for _ in range(1):  # 每个图片复制5次
#         image_files.append(image_file[a])
#     # image_files.append('')
# print(image_files)
# print(len(image_files))


# 将图片拆成14个一组
grouped_files = [image_files[i:i + t] for i in range(0, len(image_files), t)]
print(grouped_files)
print(len(grouped_files))
# 12

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

print('----3、插入docx,制作pdf------------')
# 处理每一组图片
for group_index, group in enumerate(grouped_files):
    # 创建新的Word文档
    doc = Document(path+r'\表带3.12CM9条.docx')
    # print(group)
    
    # 遍历每个单元格,并插入图片
    for i in range(1):
        for cell_index, image_file in enumerate(group):
            # 计算图片长宽(单位:厘米)
        
        # 如果是空格,就跳过
            if not image_file:
                continue
        
            # 插入图片到单元格
            table = doc.tables[0]
            cell = table.cell(int(cell_index / t), cell_index % t)
            # 如果第一行有2个格子,两个数字都写2
            cell_paragraph = cell.paragraphs[0]
            cell_paragraph.clear()
            run = cell_paragraph.add_run()
            run.add_picture(image_file, width=Cm(3.12), height=Cm(19.54))
            # run.add_picture(image_file, width=Cm(2), height=Cm(3.89))
            # 3.89
        
    # 保存Word文档
    doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
    
import os
from docx import Document
from docx.shared import Cm


t = 14  # 每组图片的数量
grouped_files = [image_files[i:i + t] for i in range(0, len(image_files), t)]
print(len(grouped_files))

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

print('----3、插入docx,制作pdf------------')
# 处理每一组图片
for group_index, group in enumerate(grouped_files):
    # 创建新的Word文档
    doc = Document(path + fr'\表带3.12CM{t}条.docx')
    
    # 获取表格对象
    table = doc.tables[0]
    
    # 遍历每个单元格,并插入图片
    cell_index = 0
    for row in table.rows:
        for cell in row.cells:
            if cell_index < len(group):
                image_file = group[cell_index]
                if image_file:
                    cell_paragraph = cell.paragraphs[0]
                    cell_paragraph.clear()
                    run = cell_paragraph.add_run()
                    run.add_picture(image_file, width=Cm(2), height=Cm(19.54))
                cell_index += 1
            elif cell_index >= len(group):
                break
    
    # 保存Word文档
    doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))

# 将10个docx转为PDF
import os
from docx2pdf import convert
from PyPDF2 import PdfFileMerger
# pdf_output_path = path+fr'\\01表带{int(len(grouped_files))}张共{int(len(image_files)/2)}图3.89五条.pdf'
# pdf_output_path = path+fr'\\01表带{int(len(grouped_files))}张共{int(len(image_files)/2)}图19.45.pdf'
pdf_output_path = path+fr'\\01表带3.12CM{t}条{(len(grouped_files))}张共{int(len(image_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'))
        time.sleep(5)


# 合并零时文件里所有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(5)

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


# 删除输出文件夹

shutil.rmtree(new_folder)
time.sleep(2)

作品展示

去打印几张测试,再调整图纸的尺寸、雌雄扣的位置等,争取把图像的像素与CM匹配,或者放大图片的局部做成手表纹理(能涂色的图案太小了)


http://www.kler.cn/a/429591.html

相关文章:

  • 怎样利用海外云手机进行引流?
  • 使用 Vite 创建 Vue 3 项目:从零开始的详细指南
  • Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)
  • day10_Structured Steaming
  • 利用AI大模型和Mermaid生成流程图
  • 【1】Word:邀请函
  • 基于STM32的手势电视机遥控器设计
  • 使用pyspark完成wordcount案例
  • Flutter 图片编辑板(二) 拖动位置和对齐线应用
  • 封闭式论文写作--全面掌握ChatGPT-4o的写作技能,掌握提示词使用技巧、文献检索与分析方法,帮助您选定研究方向,提炼学术论文题目
  • 软件漏洞印象
  • 网络安全 - Cross-site scripting
  • 刷leetcodehot100-7动态规划
  • 【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转
  • 产品经理的财会知识课:资产的减值测试
  • X推出新AI图像生成器Aurora:更接近真实的创作效果
  • Facebook与Web3的结合:去中心化社交的可能性
  • 【go】fmt包讲解与案例
  • C语言实例_27之删除字符串中指定字符
  • 出海服务器可以用国内云防护吗
  • React废弃componentWillMount和componentWillReceiveProps这两个生命周期方法
  • 【优选算法篇】:双指针算法--开启高效编码的两把“魔法指针”,练习题演练
  • Java环境变量配置
  • DP协议:缩略词
  • 工具推荐-js爬取工具
  • 【人工智能】GaussDB数据库技术及应用