读取24位黑白BMP图片信息转换为字符画的问题
程序代码:
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #pragma pack(2) /*定义WORD为两个字节的类型*/ typedef unsigned short WORD; /*定义DWORD为e四个字节的类型*/ typedef unsigned long DWORD; struct image { char data[4000]; }; struct image * p[1200]; typedef struct BMP_FILE_HEADER { WORD bType; /* 文件标识符 */ DWORD bSize; /* 文件的大小 */ WORD bReserved1; /* 保留值,必须设置为0 */ WORD bReserved2; /* 保留值,必须设置为0 */ DWORD bOffset; /* 文件头的最后到图像数据位开始的偏移量 */ } BMPFILEHEADER; typedef struct BMP_INFO { DWORD bInfoSize; /* 信息头的大小 */ DWORD bWidth; /* 图像的宽度 */ DWORD bHeight; /* 图像的高度 */ WORD bPlanes; /* 图像的位面数 */ WORD bBitCount; /* 每个像素的位数 */ DWORD bCompression; /* 压缩类型 */ DWORD bmpImageSize; /* 图像的大小,以字节为单位 */ DWORD bXPelsPerMeter; /* 水平分辨率 */ DWORD bYPelsPerMeter; /* 垂直分辨率 */ DWORD bClrUsed; /* 使用的色彩数 */ DWORD bClrImportant; /* 重要的颜色数 */ } BMPINF; typedef struct RGB_QUAD { WORD rgbBlue; /* 蓝色强度 */ WORD rgbGreen; /* 绿色强度 */ WORD rgbRed; /* 红色强度 */ WORD rgbReversed; /* 保留值 */ } RGBQUAD; int main() { int num=0; char address[100]; char name[100]; BMPFILEHEADER fileHeader; BMPINF infoHeader; long width,height; FILE * final; FILE *fp,* memry; int pix[3]; int rwidth=0,middle=0; long offset, bmpImageSize, bytesPerPixel, size, bitCount; while(1) { if(num==6566)break; sprintf(address,"e:\\BMP2\\s150_pt%d.bmp",num); sprintf(name,"e:\\mem\\pt%d.txt",num); num++; memry = fopen("e:\\time\\T.txt", "w+"); final = fopen(name,"w+"); // int i, j; // unsigned char **p; WORD c; if((fp = fopen(address, "rb")) == NULL) { printf("Cann't open the file!\n"); exit(0); } fseek(fp, 0, 0); fread(&fileHeader, sizeof(fileHeader), 1, fp); fread(&infoHeader, sizeof(infoHeader), 1, fp); //计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节 size = fileHeader.bSize; offset = fileHeader.bOffset; bmpImageSize = infoHeader.bmpImageSize; width = infoHeader.bWidth; height = infoHeader.bHeight; bitCount = infoHeader.bBitCount; bytesPerPixel = infoHeader.bBitCount / 8; printf("第%d个文件转换完成!",num); //输出每个像素点所占字节中的内容 pix[0] = fgetc(fp); pix[1] = fgetc(fp); pix[2] = fgetc(fp); while (!feof(fp)) { if(pix[0]<=10&&pix[1]<=10&&pix[2]<=10) { fputc('@',memry); } if(pix[0]>=200&&pix[1]>=200&&pix[2]>=200) { fputc(' ',memry); } rwidth++; if(rwidth==width) { fputc('\n',memry); rwidth=0; } pix[0] = fgetc(fp); pix[1] = fgetc(fp); pix[2] = fgetc(fp); } fclose(fp); fseek(memry, 0, 0); for(middle=1;middle<=height;middle++) { p[middle]=(struct image *)malloc(sizeof(struct image)); fgets(p[middle]->data,4000,memry); } middle--; for(;middle>0;middle--) { fputs(p[middle]->data,final); free(p[middle]); } rwidth=0; fclose(final); fclose(memry); } system("pause"); return 0; }在读取大图的时候没有问题,但是一旦读取小图,就会产生错位现象,并且效果极差