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

光庆 17天前 346

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

建议安装 sqlite - odbc 驱动 0.997版。

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

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

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

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

演示代码:

 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

最新回复 (2)
  • redchina 17天前
    0 2
    提示找不到\hanzi.db数据库
  • kio 16天前
    0 3

    用了下,还不错耶

    上传的附件:
返回