求助,字符画无法正常显示
如题,就左右错位画对不上位置,字符和视频的内容对不上提取码:cs0c
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>
BITMAPFILEHEADER fileHead; //文件信息头
BITMAPINFOHEADER infoHead; //位图信息头
RGBQUAD pColorTable; //颜色表指针
unsigned char *pBmpBuf; //图像数据指针
int bmpWidth; //图像的宽
int bmpHeight; //图像的高
int biBitCount; //每像素位数
int lineByte; //每行的字节数
unsigned char a;
unsigned char *Pre = NULL;
char *out;
char info[] = {"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^` ."};//根据字符的复杂到简单排列
int len ,reg = 1;
clock_t stime,ftime,ltime,lt;
#define name "picture\\wrxq"
#define frame 7196//总帧数
//还可以通过控制Print函数中打印的行数以及列数来控制更新速率
#define clearDegree 2 //隔几帧读一次
#pragma comment(lib, "WINMM.LIB")
int Read(const char *bmpName);
int Run(const char *bmpName); /*函数原型*/
void Print();
void Pos(int x, int y);
int main(int argc, char *argv[])
{
out = (char *)malloc(sizeof(char) * 40000);
system("mode con cols=4000 lines=4000");
system("color F0");
len = strlen(info) - 1;
Run(name);
free(out);
return 0;
}
int Run(const char *bmpName)
{
register int i;
int count = 0,temp = frame;
char path = "\0";
char format;
while(temp > 0)
{
++count;
temp /= 10;
}
sprintf(format,"%s%dd%s","%s%0",count,"%s");
PlaySound("wrxq.wav", NULL, SND_FILENAME | SND_ASYNC);
stime = lt = clock();
printf("%ld",stime);
for(i = 0;i < frame;)
{
if(i % 30 == 0)
{
reg = 94;
}
ftime = clock();
if((ftime - stime) >= reg)
{
reg =95;
path = '\0';
sprintf(path,format,bmpName,i,".BMP");
i+=3;
stime = ftime;
Read(path);
Print();
}
}
ltime = clock();
if(Pre)
free(Pre);
system("cls");
return 0;
}
void Print()
{
int i,j;
int x = 0;
Pos(0,0);
for(i = 17;i < bmpHeight - 17;++i)
{
if(i % clearDegree != 0)
continue;
for(j = 0;j < bmpWidth;++j)
out = info[(int)(a/256.0*len)];
out = '\n';
}
out = '\0';
printf("%s",out);
}
int Read(const char *bmpName)
{
FILE *fp = fopen(bmpName,"rb"); /*二进制读方式打开指定的图像文件*/
register int i,j;
unsigned char * pix = NULL;
if(fp==NULL)
return 0;
fread(&fileHead,sizeof(BITMAPFILEHEADER),1,fp); /*读文件信息头*/
fread(&infoHead,sizeof(BITMAPINFOHEADER),1,fp); /*读位图信息头*/
bmpWidth=infoHead.biWidth; /*获取图像宽,高,每像素所占位数等信息 */
bmpHeight=infoHead.biHeight;
biBitCount=infoHead.biBitCount;
lineByte=(bmpWidth*biBitCount/8+3)/4*4; /*计算每行字节数(必须是4的倍数)*/
if(Pre == NULL)
{
pix=(unsigned char *)malloc(lineByte+1);
Pre = pix;
}
else
pix = Pre;
if(pix == NULL)
return 0;
for(i = 0;i < bmpHeight;++i)
{
fread(pix,1,lineByte,fp);
for(j = 0;j < bmpWidth;++j)
{
a = (int)((unsigned char)(pix * 0.3 + pix * 0.59 + pix * 0.11));
}
}
fclose(fp);
return 0;
}
void Pos(int x, int y)//设置光标位置
{//要注意这里的x和y与我们数组的x和y是反的
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄
SetConsoleCursorPosition(hOutput, pos);
} 使用的是Visual C++ 6.0编译环境,win10系统
页:
[1]