aardio - 汉字笔顺处理 - json转sqlite转png

本代码需要最新版 godking.conn 库,请自行下载!

如果没有安装 odbc for sqlite 驱动,可以使用 godking.conn.driver.sqlite3.install() 安装。

也可以在此下载自行安装:http://www.chengxu.online/show.asp?softid=267

1、将json数据转为sqlite数据库,以后可以抛弃json文件。用数据库搜索汉字非常方便。

2、从数据库中搜索某个汉字的笔顺信息,进行绘图,如下图。

演示代码:

Go 复制代码
import console;
import godking.conn;
import godking.paint;
import web.json;
import brotli;
var bro = brotli();

// 将json文件内容写入数据库
var conn,err = godking.conn.openSqlite3("\hanzi.db");
if !conn {
    console.dump("打开数据库失败!pos:1",err);
    console.pause();
    return ; 
}
if !conn.existsTable("stroke"){
    conn.exec("CREATE TABLE [hanzi](hanzi TEXT,data BLOB);");
}
import fsys.file;
var f = fsys.file("\all.json");
var num,ok = 0,0;
var rs = conn.rs("hanzi")
do{ //共9574个汉字
    var t = f.readTo("}")
    ok = #t;
    if #t {
        num++;
        //提取汉字信息
        t += "}";
        t = ..string.trimleft(t,", {");
        t = web.json.parse("{"+t+"}")
        var hanzi  = table.keys(t)[1]
        var strokes = table.tostring(t[hanzi]):"";
        strokes = ..string.replace(strokes,'\n','');
        var data = ..raw.buffer(bro.compress(strokes,11));
        //加入数据库
        rs.AddNew();
        rs.setValue(1,hanzi);
        rs.setValue(2,data);
        rs.UpDate();
        //验证写入结果
        var bbb = rs.getValue(2);
        console.dump(num,"压缩数据大小:"++#data,"写入数据大小:"++#bbb,"写入结果:"++(#bbb===#data?"成功":"失败"))
    }
    if num===100 {
        console.print("仅写入前100个用作演示...")
        break;
    }
} while (ok);
//关闭文件、记录集、数据库连接
rs.close();
conn.close();
f.close();

// 定义生成汉字笔顺图片的函数
var savePic = function(hanzi,strokes){
    import godking.paint;
    var p = godking.paint(1024,1024/*高度*/,/*背景颜色*/,/*背景图像*/);
    p.scale(1 /*宽度缩放比例*/,-1/*高度缩放比例*/,/*选项*/);
    p.translate(0 /*水平偏移像素*/,-1024*7/8/*垂直偏移像素*/,/*选项*/);
    for(i=1;#strokes;1){
        var path = p.path( 1 /*0 交叉填充 1 全填充*/);
        var x,y = 0,0;
        var s = string.split(strokes[i]," ");
        for(n=1;#s;1){
            select(s[n]) {
                case "M" {
                    x,y = tonumber(s[n+1]),tonumber(s[n+2]);
                }
                case "L" {
                    var x1,y1 = tonumber(s[n+1]),tonumber(s[n+2]);
                    path.addLine(x,y,x1,y1);
                    x,y = x1,y1;
                }
                case "Z" {
                    path.closeFigure();
                }
                case "Q" {
                    var cx,cy,x1,y1 =tonumber(s[n+1]),tonumber(s[n+2]),tonumber(s[n+3]),tonumber(s[n+4]);
                    path.addBezier(x,y,cx,cy,x1,y1,x1,y1);
                    x,y = x1,y1;
                }
                case "C" {
                    var cx1,cy1,cx2,cy2,x1,y1 =tonumber(s[n+1]),tonumber(s[n+2]),tonumber(s[n+3]),tonumber(s[n+4]),tonumber(s[n+5]),tonumber(s[n+6]);
                    path.addBezier(x,y,cx1,cy1,x1,y1,cx2,cy2);
                    x,y = x1,y1;
                }
            }
        }
        p.fillPath(path,0xFFFF0000/*填充颜色或brush对象*/);
        p.saveToFlie("\"+hanzi+"笔顺"+i+".png");
        if i<#strokes p.fillPath(path,0xFF000000/*填充颜色或brush对象*/);
        path.delete();
    }
    p.close();
}

// 从数据库读取汉字笔顺信息并绘制图片
var conn,err = godking.conn.openSqlite3("\hanzi.db");
if !conn {
    console.dump("打开数据库失败!!pos:2",err);
    console.pause();
    return ; 
}
var t = conn.getTable("select * from [hanzi] where hanzi='䠀'",false/*数组*/,/*开始行*/,/*总行数*/,/*格式化参数*/);
if t[[1]] {
    var hanzi = t[1]["hanzi"];
    var data = eval(bro.decompress(t[1]["data"]));
    strokes = data["strokes"]
    radStrokes = data["radStrokes"]
    medians = data["medians"]
    console.dump(hanzi,#strokes,#medians,#radStrokes)
    savePic(hanzi,strokes)
    console.dump("已生成笔顺图片,请查看。")
}
conn.close();
console.pause(,"全部演示完毕,请查看代码文件目录内生成的笔顺图片。");

all.json 文件可以从下面附件中下载:

https://aardio.online/attach-download-357.htm

相关推荐
白叔King2 个月前
aardio 5分钟多线程开发简单入门
aardio
IssacNew5 个月前
【原创软件】第7期:文件夹生成器V1.0-按照列表批量生成文件夹,简单小巧
aardio·列表·批量生成·记住文件夹·同名文件夹·文件夹
卢光庆5 个月前
aardio —— 今日减bug
aardio
卢光庆9 个月前
aardio - godking.json 【库】测试
aardio
卢光庆1 年前
aardio - 调用C编写的dll时的不同参数类型处理方法
aardio
belldeep1 年前
aardio:用 WebView 模仿 mdict 界面
aardio·webview2