在材料demo中有如下改动
1.通过hedit可以看到示例程序生成的图片的长宽参数都是00 00 00 80也就是8*16=128
在文件头的地方将长宽修改为128
2.因为要输入三个参数 且顺序为程序 点阵文件txt 新建bmp文件 因而将argc<2改为argc<3
那么对应的点阵文件路径就是在arvc[1]中
3.将点阵文件读入二维数组中(一行一行读入)顺便可以统计有多少行
4.将二维数组处理成01的形式并打印(处理一行打印一行)
5.计算二维数组的点与图片数组bmpdata的位置关系 因为印章要居中 因此在放入之前要计算行列数
6.oj提交代码可能会提示编译错误 但编译软件是正常运行的 猜测可能oj没有定义一些函数
如果将oj提示有问题的函数删去的话 会导致无法生成图片
有大佬可以教一下如何做3-2的字符匹配吗
写的代码有些乱 只是提供3-1的思路 仅供参考#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 *fp; //BMP文件指针 long i,j,k,len; long width=128; //图像宽度 long height=128; //图像高度 long dataSize=width*height; BITMAPFILEHEADER bmfHeader; BITMAPINFOHEADER bmiHeader; if(argc<3) { printf("n 命令格式: mySeal xxxx.txt xxxx.bmpn"); printf("n 实现根据点阵信息文件""xxxx.txt""制作对应的电子印章文件""xxxx.bmp""nn"); exit(0); } //导入txt数据 char a[300][300]; //定义一个bai二维数组 int c=0; FILE *fp1; /* 定义指向文件的指针*/ if((fp1=fopen(argv[1],"r"))==NULL) /*打开一个二进制文件,为读方式*/ { printf("文件打开失败!n"); return 0; } while(!feof(fp1)) {if(1!=fscanf(fp1,"%s",a[c])) break; c++; //打印数据到二维数组中 } char b[300][300]; int len1,m,k1=0,l; len1=strlen(a[0]); int j1,i1; for(i1=0;i1<c;i1++){ k1=0; for(j1=0;j1<len1;j1++) { if(a[i1][j1]=='_') {b[i1][k1]='0';k1++; } if(a[i1][j1]=='X') {b[i1][k1]='1';k1++; } } b[i1][k1]==' '; printf("%sn",b[i1]); } len1=strlen(b[0]); //第一步:用命令行中给出的文件名新建一BMP文件,此时还是一个空文件 if((fp=fopen(argv[2], "wb+"))==NULL) { printf("Cannot open BMP file!"); exit(0); } //第二步:置文件头数据并写入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, fp); //第三步:置信息头数据并写入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, fp); //第四步:置图像RGB数据并写入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++) { k=(height-i-1)*width + j;//计算bmp图片中第i行第j列图像数据在bmpData[]数组中的位置 if(i>=(height-c)/2&&i<=(height/2+c/2)-1&&j>=(width-len1)/2&&j<=(width/2+len1/2)-1&&b[i-(height-c)/2][j-(width-len1)/2]=='0' ) { bmpData[k].rgbBlue=255; bmpData[k].rgbGreen=255; bmpData[k].rgbRed=255; } else //其他红色 { bmpData[k].rgbBlue=0; bmpData[k].rgbGreen=0; bmpData[k].rgbRed=255; } } } fwrite(bmpData,sizeof(RGBDATA),dataSize,fp);//将bmpData所指内存中的RGB数据一次性写入BMP文件 printf("n 恭喜您!BMP文件已经成功生成!n"); printf("n 请在当前目录下查看生成的BMP文件%snn",argv[2]); free(bmpData); //释放bmpData所指的内存空间 bmpData=NULL; //置bmpData为空指针 fclose(fp); //关闭fp所指文件 }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算