linyp 发表于 2024-4-20 09:09

汉字笔划,分割图片到每一个笔划

因为工作需要,看了坛友的写的一些,主要是从百度上得到,但是跟手头工作不协调,自己写了一个:
库自己按装一下

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

这个是一张图:

以下这个是按笔划分割的单张图:



爱在何方 发表于 2024-4-20 10:32

有大佬生成一个成品么

magiclyan 发表于 2024-4-20 09:47

国文老师狂喜中{:17_1069:}

mytomsummer 发表于 2024-4-20 10:08

感谢分享支持一下

123456789052 发表于 2024-4-20 10:22

幼儿园练字佳音{:1_921:}

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

期待成品,娃娃们有福了!
页: [1] 2 3 4
查看完整版本: 汉字笔划,分割图片到每一个笔划