根据输入的文字生成印章
根据输入的文字生成印章
- 前言
- 题目![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/62eabc11e29c5195e7c520e241ade3b2.png#pic_center)
- 步骤
- (1) 打开命令行窗口,执行exe文件
- (2)思路
- (3)代码
- (4)效果![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ae97806d2fd179ed498a34265e244f03.png#pic_center)
- 改进与优化
- 蒟蒻的话
前言
一年一度的课设又又又开始了,不少程序猿又要为自己的头发开始担心了
题目
步骤
(1) 打开命令行窗口,执行exe文件
-
win + R,输入cmd;
-
将exe拖入窗口(例如C:\Users\hynoe\Desktop\ti2\test.exe);
-
输入cd + 空格 + exe路径(例如cd C:\Users\hynoe\Desktop\ti2);
-
输入test.exe XingKai56.txt xxxx.bmp,回车;
-
输入四个汉字即可完成。
(2)思路
- 查找汉字编码。一般来说,指导书里会给出求汉字编码的代码,对于本题来说只要copy那段代码就好了(如果是题目一的话,就需要在记事本Ctrl + F 查找了)。
- 将汉字编码转换成字符串,并用二维数组存储起来。
- 最重要的一步,通过汉字编码读取txt文件,我采取的是通过读取一整行的方式,当确定了汉字编码时,从下下行开始读取,每当读取了56行,就可以break,并将指针返回文件首,反复四次即可(在读取时,即可将‘,’去除)。
- 调整字的位置,这一步对于部分同学来说可能理解起来有点困难,但是对于通过了题目一并创新的同学来说,很简单,甚至可以直接copy题目一的代码,对于不理解这步的同学,只要画个图,结合代码就很好理解了(首先是读取第一、二个字,行不变,然后是读取第三、四个字,列不变)。
- 最简单的一步,写入bmp文件。
(3)代码
/****************************************************************************
**** 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)=16
typedef 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;
int main(int argc, char *argv[])
{
RGBDATA *bmpData=NULL; //图像数据指针
FILE *fp1,*fp2; //BMP文件指针
unsigned char BM[100];
char str[200];
long t = 5;
long width=112 + 4 * t; //图像宽度
long height=112 + 4*t; //图像高度
long dataSize=width*height;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;
if(argc<3)
{
printf("\n 请指定您要生成的BMP文件名!\n");
printf("\n 方法1:在cmd窗口输入: test.exe XingKai56.txt xxxx.bmp 后回车执行!\n");
printf("\n 方法2:在VC的工程设置中添加参数: XingKai56.txt xxxx.bmp后编译运行!\n");
printf("\n 功能: 根据设定红绿蓝三色分量的值,控制显示不同的彩色条纹!\n\n");
exit(0);
}
//第一步:用命令行中给出的文件名新建一BMP文件,此时还是一个空文件
//打开用windows + R ,cmd 打开两个的两个命令参数argv[1],argv[2]
if(!(fp2 = fopen(argv[1], "rb")))
{
printf("Cannot open 字体.txt file!");
exit(0);
}
if(!(fp1 = fopen(argv[2], "wb+")))
{
printf("Cannot open BMP file!");
exit(0);
}
int i, len, j = 0, k, c = 0;
char bm[4][5];
printf("请输入一个或多个汉字:\n");
scanf("%s", BM);
for(len = 0; BM[len]; len++);
for(i = 0; i < len; i++)
sprintf(str+2*i, "%x", BM[i]);
for(i = 0; i < 2*len; i += 4){ // 将编码转化为字符并存入二维数组
strncpy(bm[j], str + i, 4);
bm[j][4] = 0;
j++;
}
printf("汉字编码为:");
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
printf("%c ", bm[i][j]);
}
printf(" ");
}
printf("\n");
char st1[120], st[120]; //读取 txt
char a[300][300], b[300][300], d[300][300];
int w, ans = 0, r, n;
for(i = 0; i < 4; i++){
rewind(fp2);
while(!feof(fp2)){
fgets(st1, sizeof(st1) - 1, fp2);
if(strstr(st1, bm[i])){
while(fgetc(fp2) != '\n'); // 由于查到的只是汉字的编码,需要跳过下面一行才能开始读取
for(w = 0; w < 56; w++){
fgets(st, sizeof(st) - 1, fp2);
for(r = 0, n = 0; r < 56; r++, n++){
if(st[n] == '_' || st[n] == 'X') a[ans][r] = st[n]; // 去掉逗号
else r--;
}
ans++;
}
break;
}
}
}
for(i = 0; i <= 111; i++){ // 这里其实有两步,不过我懒,就合为一步了,但也很简单,就是先第一、二个字,然后第三、四个字
for(j = 0; j <= 111; j++){
if(j > 55) b[i+2*t][j+2*t] = a[i][j - 56];
else b[i+2*t][j+2*t] = a[i + 112][j];
}
}
//第二步:置文件头数据并写入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;
if(b[i][j] == 'X' || i < 1.8*t || j < 1.8*t || i >= height-1.8*t || j >= width-1.8*t) // 1.8可以改变,它只是字与边框的距离
{
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;
}
}
}
fwrite(bmpData,sizeof(RGBDATA),dataSize,fp1);//将bmpData所指的RGB数据一次性写入BMP文件
printf("\n ******************************************************************\n");
printf("\n 感谢您使用BMP图片文件制作DEMO程序 \n");
printf("\n 作者:XXX \n");
printf("\n 日期:2024年2月29日 \n");
printf("\n 目的:编制印章生成程序时,供参考! \n");
printf("\n 功能:根据设定红绿蓝三色分量的值,输入不同的文字,制作不同的印章\n\n");
printf("\n ******************************************************************\n\n");
printf("\n 恭喜您!BMP文件已经成功生成!\n");
printf("\n 请在当前目录下查看生成的BMP文件%s\n\n",argv[2]);
free(bmpData); //释放bmpData所指的内存空间
bmpData=NULL; //置bmpData为空指针
fclose(fp1); //关闭fp所指文件
fclose(fp2);
}
(4)效果
改进与优化
这并非最终版本,作为hnuster,肯定要进行创新的,这里的话,这个边框是可以改变的,如果是每次都去改一下代码的话,无疑是很麻烦的,所以我们可以在命令行窗口直接输入边框的数值
如果不改变的话,就数值就是5;再把它转化一下就好了
long t = atoi(argv[3]);
不过此时以下代码要放在最前面
int main(int argc, char *argv[])
{
if(argc<4)
{
printf("\n 请指定您要生成的BMP文件名!\n");
printf("\n 方法1:在cmd窗口输入: ti3pro.exe xxxx.bmp XingKai56.txt 5 后回车执行!\n");
printf("\n 方法2:在VC的工程设置中添加参数: xxxx.bmp 后编译运行!\n");
printf("\n 功能: 根据设定红绿蓝三色分量的值,控制显示不同的彩色条纹!\n\n");
exit(0);
}
否则会报错
蒟蒻的话
课设对我们这些萌新来说的确是一种很大的挑战,但同时来说也会从中学会很多,可以从网上借鉴各种模板,就像我写这几个题目时就从网上看了很多模板,并从中间找到了思路,最后写了出来。希望通过我的博客能给你们带来思路。
(蒟蒻第一次写博客,排版不是那么好,如果有错误,请指出,谢谢!!!)
CSDN-Ada助手: 恭喜你开通了自己的博客!标题“蒟蒻的博客”很有个性,看来你对自己的博客有了明确的定位。接下来建议你在博客中多分享一些个人见解和经验,或者写一些有趣的故事,让读者更加了解你。希望你能坚持下去,不断进步,期待看到更多精彩的内容! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1
CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/618140788。