编程实现根据输入的汉字制作不同的电子印章

  • 具体要求:
  • 思路:
  • 程序代码:
  • CB运行结果:
  • 使用流程:
    • 第一步:首先在用户目录下建立不同字体的查询表,和空的 bmp 格式文件
    • 第二步:Windows+R 运行cmd,
    • 第三步:cmd总中输入三个参数,回车运行
    • 第四步:根据提示输入要制作的印章,回车生成 bmp 印章
  • 印章效果:
  • 陌生函数:
  • 字体表资源:

具体要求:

1)从键盘输入4个汉字,根据汉字的编码在隶书56点阵汉字字库文本文件LiShu56.txt中查找相应汉字的字型点阵信息,并将点阵信息存入数组。

2)建立印章文件XXX.bmp,按照BMP文件的格式写入文件头、信息头。

3)然后根据数组中的汉字点阵信息确定颜色数据写入XXX.bmp文件中。XXX.txt文件中的一个字符对应于XXX.bmp文件中一个彩色点的数据(包括蓝、绿、红三个字节数据,若是红色点,一般置B=0、G=0,R=255)

4)检查文件头、信息头、彩色数据是否符合BMP文件的格式规范,若规范,则在windows环境下可以正常浏览和使用该电子印章图片了。

5)隶书点阵文本文件LiShu56.txt和生成的印章文件XXX.bmp通过命令行参数给定。假如程序编译连接后生成的可执行文件名为mySeal.exe,则用LiShu56.txt制作印章XXX.bmp的命令为:mySeal LiShu56.txt XXX.bmp,执行该命令后输入“令狐冲印”4个汉字生成的红色印章如图4(a)所示。采用其它字体点阵文件生成的印章如图4(a)所示,

思路:

首先你需要输入想要制作的印章的汉字,要查表就要把汉字转化为十六进制的编码,然后把编码每四个分段,摘取每一段代码然后进入汉字表中查找,当你找到该汉字的编码时,编码下面的 56 行就是该汉字的表示,每一行有63个字符(56个__和X,还有7个,)遇到‘,’直接跳过,遇到__RGB赋值为白色,‘X’ 赋值为红色即可,剩下的就是代码实现了。

程序代码:

/********************************************************************************  FileName:  demo.c****  Function:  真彩色bmp图片文件的创建****  Usage:     demo  xxxx.bmp*****************************************************************************/#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <math.h>#include <malloc.h>#include <string.h>typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned long DWORD;/****  The file header of bmp file 文件头*****/#include <pshpack2.h> //This file turns 2 byte packing of structures on, then sizeof(BITMAPFILEHEADER)=14, otherwise sizeof(BITMAPFILEHEADER)=16typedef struct tagBITMAPFILEHEADER
{WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfoffBits;} BITMAPFILEHEADER;#include <poppack.h> //This file turns packing of structures off/****  The information header of bmp file 信息头*****/typedef struct tagBITMAPINFOHEADER
{DWORD biSize;DWORD biWidth;DWORD biHeight;WORD  biPlanes;WORD  biBitCount;DWORD biCompress;DWORD biSizeImage;DWORD biXPeIsPerMeter;DWORD biYPeIsPerMeter;DWORD biCIrUsed;DWORD biClrImprotant;} BITMAPINFOHEADER;/****  The RGB data of bmp file 图像RGB数据*****/typedef struct tagRGBDATA
{BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;} RGBDATA;char str_key[4];
char str_col[120];int main(int argc, char *argv[])
{RGBDATA *bmpData=NULL; //图像数据指针FILE *fp1,*fp2; //BMP文件指针unsigned char BM[100];char str[200];long i,j,k;long width=120; //图像宽度long height=120; //图像高度long dataSize=width*height;BITMAPFILEHEADER bmfHeader;BITMAPINFOHEADER bmiHeader;if(argc<2){printf("\n    请指定您要生成的BMP文件名!\n");printf("\n    方法1:在cmd窗口输入: demo  xxxx.bmp 后回车执行!\n");printf("\n    方法2:在VC的工程设置中添加参数: xxxx.bmp 后编译运行!\n");printf("\n    功能: 根据设定红绿蓝三色分量的值,控制显示不同的彩色条纹!\n\n");exit(0);}printf("\n    ******************************************************************\n");printf("\n         感谢您使用BMP图片文件制作DEMO程序                 \n");printf("\n             作者:张三                 \n");printf("\n             日期:2020年6月12日                 \n");printf("\n             目的:编制印章生成程序时,供参考!       \n");printf("\n             功能:根据设定红绿蓝三色分量的值,控制显示不同的彩色条纹!\n\n");printf("\n    ******************************************************************\n\n");//第一步:用命令行中给出的文件名新建一BMP文件,此时还是一个空文件//打开用windows + R ,cmd 打开两个的两个命令参数argv[1],argv[2]if(!(fp1 = fopen(argv[1], "wb+"))){printf("Cannot open BMP file!");exit(0);}if(!(fp2 = fopen(argv[2], "r"))){printf("Cannot open 字体.txt file!");exit(0);}//将编码转化为字符并显示,将汉字的编码转到str数组里,用于后续查找printf("请输入你想制作印章的汉字: ");scanf("%s",BM);int len;for(len = 0; BM[len] != '\0'; len++);for(i = 0; i < len; i++)printf("BM[%d] = %x\n",i,BM[i]);for(i = 0; i < len; i++)sprintf(str+2*i,"%x",BM[i]);printf("将编码转化为字符并显示 :%s\n",str);//第二步:置文件头数据并写入BMP文件bmfHeader.bfType=0x4d42;bmfHeader.bfSize=14+40+width*height*3;bmfHeader.bfReserved1=0;bmfHeader.bfReserved2=0;bmfHeader.bfoffBits=0x36;fwrite(&bmfHeader, sizeof(BITMAPFILEHEADER), 1, fp1);//第三步:置信息头数据并写入BMP文件bmiHeader.biSize=40;bmiHeader.biWidth=width;bmiHeader.biHeight=height;bmiHeader.biPlanes=1;bmiHeader.biBitCount=24;bmiHeader.biCompress=0;bmiHeader.biSizeImage=width*height*3;bmiHeader.biXPeIsPerMeter=0;bmiHeader.biYPeIsPerMeter=0;bmiHeader.biCIrUsed=0;bmiHeader.biClrImprotant=0;fwrite(&bmiHeader, sizeof(BITMAPINFOHEADER), 1, fp1);//第四步:置图像数据并写入BMP文件//分配足够内存,让bmpData指向这块内存,用于存放图像各象素点的RGB分量值if((bmpData=(RGBDATA*)malloc(width*height*3))==NULL){printf("bmpData memory malloc error!");}//先在bmpData所指内存中置图像RGB数据,然后将所有数据写入BMP文件for(i=0; i<height; i++) //边框设置为红色{for(j=0; j<width; j++){int k=(height-i-1)*width + j;//计算bmp图片中第i行第j列图像数据在bmpData[]数组中的位置if((i >= 0 && i <= 3)||(i >= 116 && i <= 119) || (j >= 0 && j <= 3) || (j >= 116 && j <= 119)){bmpData[k].rgbBlue = 0;bmpData[k].rgbGreen = 0;bmpData[k].rgbRed = 255;}else{bmpData[k].rgbBlue = 255;bmpData[k].rgbGreen = 255;bmpData[k].rgbRed = 255;}}}int dx[4] = {4,56,4,56};//为了安排四个字的位置,采用每个字做不同的偏移int dy[4] = {56,56,4,4};//(4,56)(56,56)(4,4)(56,4) 分别是第一二三四个字for(i = 0 ; i < 16; i += 4){strncpy(str_key, str + i, 4);   //每次从str数组中截取4个字符串,进行匹配,在表中找到汉字rewind(fp2);   //将指针置于文件头,从头开始寻找。while( !feof(fp2) ){fgets(str_col, sizeof(str_col)-1, fp2 );  //每次从汉字表中读取一行,放入stri中一定要-1把、0去掉if( strstr(str_col, str_key ))   //匹配到汉字的编码{for(int w = 0; w < 56; ++w){fgets(str_col, sizeof(str_col)-1, fp2 );  //每次从汉字表中读取一行,放入stri中一定要-1把、0去掉int char_irl = 0; //标记不合法字符,遇到,跳过for( j = 0; j < 63; ++j ){int k = (height-w-1-dx[i/4])*width + j +dy[i/4]-char_irl;if(str_col[j] == ','){char_irl++;continue;}if(str_col[j] == 'X'){bmpData[k].rgbBlue = 0;bmpData[k].rgbGreen = 0;bmpData[k].rgbRed = 255;}else{bmpData[k].rgbBlue = 255;bmpData[k].rgbGreen = 255;bmpData[k].rgbRed = 255;}}}break;//找到了一个字,得跳出循环重新从第一行找起,省时间}}}fwrite(bmpData,sizeof(RGBDATA),dataSize,fp1);//将bmpData所指的RGB数据一次性写入BMP文件printf("\n    恭喜您!BMP文件已经成功生成!\n");printf("\n    请在当前目录下查看生成的BMP文件%s\n\n",argv[1]);free(bmpData); //释放bmpData所指的内存空间bmpData=NULL; //置bmpData为空指针fclose(fp1); //关闭fp所指文件fclose(fp2);}

CB运行结果:

使用流程:

  • 第一步:首先在用户目录下建立不同字体的查询表,和空的 bmp 格式文件

  • 第二步:Windows+R 运行cmd,

  • 第三步:cmd总中输入三个参数,回车运行

  • 第四步:根据提示输入要制作的印章,回车生成 bmp 印章

  • 印章效果:

行楷
链接:https://pan.baidu.com/s/1rwVA8Djw90r79zv6rzC8PQ 提取码:l5d9

隶书
链接:https://pan.baidu.com/s/1QL_FlQpw3TeqfV23uuYRJg 提取码:8b7d
汉字内码扩展规范(GBK)
链接:https://pan.baidu.com/s/1qMtdl9KLvFcdaegWCxYSqg 提取码:9xnm
本文借鉴JKR10000的博客,有很多改善,希望对你有帮助,谢谢 !

编程实现根据指定汉字生成电子印章相关推荐

  1. 问题 U: 任务3-1:编程实现根据指定文本生成电子印章(超详细教程)

    hnuster!看了很多关于该题的解法但是我们发现,我们竟然下不了手!!!第一个问题:制作属于自己名字的txt(即xds.txt).这个都不会,可是网上的其他解法都一笔带过了,琢磨了半天弄清楚的. 下 ...

  2. 编程实现根据指定文本生成电子印章

    在材料demo中有如下改动 1.通过hedit可以看到示例程序生成的图片的长宽参数都是00 00 00 80也就是8*16=128 在文件头的地方将长宽修改为128 2.因为要输入三个参数 且顺序为程 ...

  3. C#生成电子印章源码

    C#生成电子印章源码 using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  4. OpenCV后投影,利用阈值函数分割指定区域生成掩膜,通过直方图分布查找其他图像相同区域。

    一.API函数 void mixChannels(const Mat* src,int nsrc,Mat* dst ,int ndst,const int* fromTo,size_t npairs) ...

  5. python读取excel指定列-Python读取excel指定列生成指定sql脚本的方法

    需求 最近公司干活,收到一个需求,说是让手动将数据库查出来的信息复制粘贴到excel中,在用excel中写好的公式将指定的两列数据用update这样的语句替换掉. 例如: 有个A库,其中有两个A.01 ...

  6. Visual Studio 中指定自定义生成事件

    自定义生成事件打开方式 通过指定自定义生成事件,可以在生成开始之前或在它完成之后自动运行命令.在Visual Studio中通过右键项目->属性 进入项目属性菜单. 自定义生成事件的语法 生成事 ...

  7. python读xml文件生成头文件_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

  8. python生成xml文件工具_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

  9. Linux系统编程:获取指定目录下指定文件类型的数量

    分析 编程实现对指定目录下的指定文件类型数量的统计.这里涉及到对目录文件的打开和对目录文件下的文件的遍历. 这里主要用的2个库函数,打开目录的 opendir函数,readdir函数.对这2个库函数不 ...

最新文章

  1. hdu 1166 敌兵布阵
  2. 【PC工具】免费文库文档下载器,破解文库下载器,免费下载文库文档,文库下载器...
  3. async spring 默认线程池_Spring boot注解@Async线程池实例详解
  4. 栅格单元值的选取方法_计算机求解微分方程的六大数值计算方法
  5. c++ windows 光标操作_电脑操作常用快捷键
  6. 软件测试工程师如何编写一篇杀手级简历?
  7. iphone开发中图像处理相关要点
  8. 雷林鹏分享:jQuery EasyUI 数据网格 - 自定义排序
  9. Python多进程之Pool
  10. 刘宇凡:莫沉浮华,归于平凡
  11. VC++界面编程之--实现工具栏自定义皮肤
  12. 音箱高音测试电脑软件,BOSE MusicMonitor电脑扬声器晒单 使用体验_什么值得买
  13. 【破解工具】Hashcat加密破解工具
  14. three.js obj模型的mtl材质贴图不显示
  15. 小程序-手写签名(附代码)
  16. C++经典算法题-洗扑克牌(乱数排列)
  17. linux内核代码研读与实战,Linux内核源码研读与实战演练
  18. JavaScript获得字符串实际长度
  19. 欢迎进入夜色的繁星博客导航一站式搜索(所有博客的汇总帖)
  20. tmall.product.schema.add(淘宝天猫商品发布接口),淘宝商品发布API接口,tmall.product.schema.get产品信息获取接口

热门文章

  1. 【转】Braid - 一个发人深思的游戏
  2. 一个屌丝程序猿的人生(三十一)
  3. 【Python小程序】怀旧经典 | 特色玩法,代码版本的钢琴小游戏了解下?初学钢琴,能提高双手协调与反应能力哦~(源码分享)
  4. Linux开发:快速开发游戏的9个关键!
  5. Python实现最短路问题常见求解算法2——Label Correcting Algorithm(deque)
  6. 研究生期间如何做研究
  7. 视频剪辑软件怎么调声像和音量?
  8. 用苹果闲置手机做网站服务器,iPhone手机上搭建nodejs服务器步骤方法
  9. 航向的表示_飞机跑道上各种标识的含义
  10. 被Teamviewer 割韭菜后 我才发现我大国产远控软件真香