69,615
社区成员
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
void readBmp(char filename[]);
int fac(int n);
struct Bmp
{
int w; // 二值图像的宽度(像素的列数)
int h; // 二值图像的高度(像素的行数)
int s; // 二值图像像素数据存储的起始位置
unsigned char **data;
}bmp;
int main(void)
{
int i;
char filename[128];
readBmp(filename);
for(i=bmp.h-1;i>=0;i--)
printf("%s\n",bmp.data[i]);
for(i=0;i<bmp.h;i++)
free(bmp.data[i]);
free(bmp.data);
}
void readBmp(char filename[])
{
int count=0,i,m=0,n=0,r,j,k;
unsigned int flag;
int data[8],**a=NULL;
FILE *fp;
bmp.data=NULL;
printf("请输入二值位图图像的文件名:");
gets(filename);
fp=fopen(filename, "rb"); // 打开文件
if(fp == NULL)
{
printf("图像文件 %s 不存在,请检查后重试!\n", filename);
exit(1);
}
fseek(fp, 18, SEEK_SET);
fread(&bmp.w, sizeof(int), 1, fp); // 读图像的宽度
fread(&bmp.h, sizeof(int), 1, fp); // 读图像的高度
fseek(fp, 10, SEEK_SET);
fread(&bmp.s, sizeof(int), 1, fp); // 读取图像像素数据存储的起始位置
printf("图像的宽度 = %d\n", bmp.w);
r=bmp.w%32;
printf("图像的高度 = %d\n", bmp.h);
printf("图像像素数据存储的起始位置 = %d\n", bmp.s);
bmp.data=(unsigned char**)malloc(sizeof(unsigned char)*bmp.h);
if(bmp.data==NULL)
{
printf("can't");
exit(-1);
}
for(i=0;i<bmp.h;i++)
bmp.data[i]=(unsigned char*)malloc(sizeof(unsigned char)*(bmp.w+1));
a=( int**)malloc(sizeof( int)*bmp.h);
for(i=0;i<bmp.h;i++)
a[i]=(int*)malloc(sizeof(int)*(bmp.w+32));
fseek(fp,bmp.s,SEEK_SET);
while(1)
{
k=fread(&flag,1,1,fp);
if(k!=1)
{
printf("no");
exit(-1);
}
if(feof(fp)!=0)
break;
for(i=0;i<8;i++)
{
data[i]=flag%2;
flag=flag/2;
}
for(i=7;i>=0;i--)
{
a[m][n]=data[i];
n++;
}
if(r!=0)
{
if(n>=bmp.w+32-r)
{
m++;
n=0;
}
}
else if(n>=bmp.w)
{
m++;
n=0;
}
for(i=0;i<bmp.h;i++)
{
for(j=0;j<bmp.w;j++)
if(a[i][j]==0)
bmp.data[i][j]='*';
else
bmp.data[i][j]=' ';
bmp.data[i][j]='\0';
}
}
for(i=0;i<bmp.h;i++)
free(a[i]);
free(a);
fclose(fp);
}
下面的是未加动态数组时的程序,能正常运行
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define MAX_ROWS 300
#define MAX_COLS 300
void readBmp(char filename[]);
int fac(int n);
struct Bmp
{
int w; // 二值图像的宽度(像素的列数)
int h; // 二值图像的高度(像素的行数)
int s; // 二值图像像素数据存储的起始位置
unsigned char data[MAX_ROWS][MAX_COLS];
}bmp;
int main(void)
{
int i;
char filename[128];
readBmp(filename);
for(i=bmp.h-1;i>=0;i--)
printf("%s\n",bmp.data[i]);
}
void readBmp(char filename[])
{
int count=0,i,m=0,n=0,r,j;
unsigned int flag;
int data[8],a[300][320];
FILE *fp;
printf("请输入二值位图图像的文件名:");
gets(filename);
fp=fopen(filename, "rb"); // 打开文件
if(fp == NULL)
{
printf("图像文件 %s 不存在,请检查后重试!\n", filename);
exit(1);
}
fseek(fp, 18, SEEK_SET);
fread(&bmp.w, sizeof(int), 1, fp); // 读图像的宽度
fread(&bmp.h, sizeof(int), 1, fp); // 读图像的高度
fseek(fp, 10, SEEK_SET);
fread(&bmp.s, sizeof(int), 1, fp); // 读取图像像素数据存储的起始位置
printf("图像的宽度 = %d\n", bmp.w);
r=bmp.w%32;
printf("图像的高度 = %d\n", bmp.h);
printf("图像像素数据存储的起始位置 = %d\n", bmp.s);
fseek(fp,bmp.s,SEEK_SET);
while(1)
{
fread(&flag,1,1,fp);
if(feof(fp)!=0)
break;
for(i=0;i<8;i++)
{
data[i]=flag%2;
flag=flag/2;
}
for(i=7;i>=0;i--)
{
a[m][n]=data[i];
n++;
}
if(r!=0)
{
if(n>=bmp.w+32-r)
{
m++;
n=0;
}
}
else if(n>=bmp.w)
{
m++;
n=0;
}
for(i=0;i<bmp.h;i++)
{
for(j=0;j<bmp.w;j++)
if(a[i][j]==0)
bmp.data[i][j]='*';
else
bmp.data[i][j]=' ';
bmp.data[i][j]='\0';
}
}
fclose(fp);
}