吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1816|回复: 32
收起左侧

[Python 原创] 汉字笔划,分割图片到每一个笔划

[复制链接]
linyp 发表于 2024-4-20 09:09
因为工作需要,看了坛友的写的一些,主要是从百度上得到,但是跟手头工作不协调,自己写了一个:
库自己按装一下
[Python] 纯文本查看 复制代码
from PIL import Image  
import requests
from bs4 import BeautifulSoup
import os
def split_grid_rows(image_path, grid_cols=6, grid_rows=6,spacing=3): 
    #转为黑白色处理
    def convert_image_gray(image_path):
        image_convert = Image.open(image_path)
        # 将图片转换为灰度图(黑白色)  
        gray_image = image_convert.convert('L')
        # gray_image.show()
        gray_image.save(image_path)
    #是否转为黑白
    # convert_image_gray(image_path)
    # 打开图片  
    image = Image.open(image_path)  
    # 获取图片的总宽度和总高度  
    width, height = image.size 
    # 计算单个格子的宽度和高度(假设所有格子大小相同)  
    # 这里减去了(grid_cols-1)*spacing的列间距和两侧的边缘间距  
    grid_width = (width - (grid_cols - 1) * spacing) // grid_cols-1
    # 计算行数,这里假设格子占据了整个图片的高度,除了顶部的间距  
    num_rows = grid_rows
    


    # 切分格子的函数  
    def crop_grid_cell(row, col):
        if col==0:
            x1 = col * (grid_width)  
            y1 = row * (grid_width)
        elif col>=1:
            x1 = col * (grid_width + spacing+1)  
            y1 = row * (grid_width + spacing+1)

        if col==0 and row>=1:
            x1 = col * (grid_width)  
            y1 = row * (grid_width + spacing+1)
        x2 = x1 + grid_width  
        y2 = y1 + grid_width
        # print((x1, y1))  
        return image.crop((x1, y1, x2, y2)) 

    # 初始化一个列表来存储所有切分出来的格子图片  
    grid_cells = []  
    # 遍历每一行  
    for row in range(num_rows):  
        row_cells = []  
        # 遍历每一列  
        for col in range(grid_cols):  
            cell = crop_grid_cell(row, col)  
            row_cells.append(cell)  
        grid_cells.append(row_cells)  
      
    return grid_cells

def calculate_rows(Nums):  
    # 每一行有6个数字  
    rows = Nums // 6  # 使用整数除法来获取行数  
    remainder = Nums % 6  # 计算余数,即不满一行的数字个数  
    # 如果余数不为0,说明还有不满一行的数字,需要额外增加一行  
    if remainder > 0:  
        rows += 1  
    return rows
def split_image(img_path='image.png',g_cols=6,g_rows=1,spacing=3,total_bihua=0):
    # 图片路径  
    last_slash_index = img_path.rfind('/')
    short_path = img_path[:last_slash_index]  
    # 调用函数切分格子
    grid_cells = split_grid_rows(img_path)  
    # 如果需要保存切分后的格子图片
    i=1  
    for row_num, row_cells in enumerate(grid_cells):  
        for col_num, cell in enumerate(row_cells):
            cell_path =short_path+"/"+ f'{i}.png'  
            cell.save(cell_path)
            i=i+1
            if i>= total_bihua:
                return True

def query_Chinese_characters(characters):
    query_server_host="https://zidian.yw11.com"
    query_server_path="/bishun"
    for c in characters:
        image_number,image_short_src=download_html(query_server_host+query_server_path+"/"+c)
        if image_short_src:
           image_short_full_src=query_server_host+image_short_src
           ret_file_path=download_image(image_short_full_src,c)
           print(ret_file_path)
           if ret_file_path:
                grows=calculate_rows(image_number+1)
                print(image_number,grows)
                #如果需要最后一个完整的字,请将total_bihua增为:image_number+1+1
                split_image(ret_file_path,g_cols=6,g_rows=grows,spacing=3,total_bihua=image_number+1)


def download_html(url):
    res = requests.get(url)
    res_text = res.text
    doc = BeautifulSoup(res_text,'html.parser')
    i_tags = doc.find_all('i')
    # 获取最后一个<i>标签的文本内容,得到笔划数  
    last_i_tag_text = i_tags[-1].get_text() 
    number = int(last_i_tag_text)
    # print(number)

    query_image = doc.find('img',class_="biImgBox")#提取笔顺表
    if query_image:  
        src_value = query_image.get('src') 
        return (number,src_value)  # 在此返回一个元组,包含笔划总数,笔划表地址
    else:
        print("Image with class 'biImgBox' not found.")

def download_image(url,character_c): 
    print(url) 
    # 发送GET请求  
    response = requests.get(url, stream=True)  
    # 检查请求是否成功  
    if response.status_code == 200:
        #新建文件夹、文件
        get_type=url.split('.')[-1]
        dir_path='characters/'+character_c
        os.makedirs(dir_path, exist_ok=True)
        file_path=dir_path+"/"+character_c+"."+get_type
 
        # 打开文件以二进制写模式写入内容  
        with open(file_path, 'wb') as file:  
            # 迭代响应内容并写入文件  
            for chunk in response.iter_content(chunk_size=8192):  
                file.write(chunk)  
        # print(f"图片已成功下载到 {filename}")
        return file_path

    else:  
        print(f"请求失败,状态码: {response.status_code}")
        return False

if __name__ == '__main__':
    query_Chinese_characters("打开文件以二进制写模式写入内容")
    pass

这个是一张图:
模.png
以下这个是按笔划分割的单张图:

1.png 2.png 3.png 4.png 5.png
6.png 7.png 8.png 10.png 11.png
13.png 14.png
12.png
9.png

免费评分

参与人数 11吾爱币 +17 热心值 +10 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
0jiao0 + 1 谢谢@Thanks!
wanfon + 1 + 1 热心回复!
cux666 + 1 谢谢@Thanks!
Liujinku + 1 + 1 用心讨论,共获提升!
woyucheng + 1 + 1 谢谢@Thanks!
lgc81034 + 1 谢谢@Thanks!
nywthy + 2 + 1 谢谢@Thanks!
mafei3709 + 1 + 1 热心回复!
helian147 + 2 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱在何方 发表于 2024-4-20 10:32
有大佬生成一个成品么
magiclyan 发表于 2024-4-20 09:47
mytomsummer 发表于 2024-4-20 10:08
123456789052 发表于 2024-4-20 10:22
幼儿园练字佳音
iawyxkdn8 发表于 2024-4-20 10:34
这个不是一般能会用的,我自己原来都是用PPT或是WORD来拆汉字!
飘水 发表于 2024-4-20 10:46
感谢楼主,期待成品,下载试试
Xs53 发表于 2024-4-20 10:53
期待成品,可以直接导出笔画的高清图片
wkdxz 发表于 2024-4-20 11:04
很不错,感谢提供分享
nywthy 发表于 2024-4-20 11:34
期待成品,娃娃们有福了!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-16 03:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表