user-0 提问: C++读取8位和24位bmp图到txt改写成c语言，求助

回复:
user: user-0
content: 然并卵，谢谢大家

user: user-1
content: 仅供参考：#include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")  using namespace std; using namespace Gdiplus;  int main() {     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);      wstring infilename(L"1.jpg");     string outfilename("color.txt");      Bitmap* bmp = new Bitmap(infilename.c_str());     UINT height = bmp->GetHeight();     UINT width  = bmp->GetWidth();     cout << "width " << width << ", height " << height << endl;      Color color;     ofstream fout(outfilename.c_str());      for (UINT y = 0; y < height; y++)     for (UINT x = 0; x < width ; x++) {             bmp->GetPixel(x, y, &color);             fout << x << "," << y << ";"                  << (int)color.GetRed()   << ","                  << (int)color.GetGreen() << ","                  << (int)color.GetBlue()  << endl;     }      fout.close();      delete bmp;     GdiplusShutdown(gdiplustoken);     return 0; }

user: user-2
content: 修改如下：  #include<math.h> #include <stdlib.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //以下该模块是完成BMP图像(彩色图像是24bit RGB各8bit)的像素获取，并存在文件名为xiang_su_zhi.txt中 unsigned char *pBmpBuf;//读入图像数据的指针  int bmpWidth;//图像的宽 int bmpHeight;//图像的高 RGBQUAD *pColorTable;//颜色表指针  int biBitCount;//图像类型，每像素位数 			   //------------------------------------------------------------------------------------------- 			   //读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存，存放在相应的全局变量中 bool readBmp(char *bmpName) { 	FILE *fp = fopen(bmpName, "rb");//二进制读方式打开指定的图像文件  	if (fp == 0) return 0;  	//跳过位图文件头结构BITMAPFILEHEADER  	fseek(fp, sizeof(BITMAPFILEHEADER), 0);  	//定义位图信息头结构变量，读取位图信息头进内存，存放在变量head中  	BITMAPINFOHEADER head;  	fread(&head, sizeof(BITMAPINFOHEADER), 1, fp); //获取图像宽、高、每像素所占位数等信息  	bmpWidth = head.biWidth;  	bmpHeight = head.biHeight;  	biBitCount = head.biBitCount;//定义变量，计算图像每行像素所占的字节数（必须是4的倍数）  	int lineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;//灰度图像有颜色表，且颜色表表项为256  	if (biBitCount == 8) 	{  		//申请颜色表所需要的空间，读颜色表进内存  		//pColorTable = new RGBQUAD[256];  //对应如下的C代码 		pColorTable = malloc(sizeof(RGBQUAD) * 256);  		fread(pColorTable, sizeof(RGBQUAD), 256, fp);  	}  	//申请位图数据所需要的空间，读位图数据进内存  	//pBmpBuf = new unsigned char[lineByte * bmpHeight]; 	pBmpBuf = malloc(sizeof(unsigned char)*lineByte * bmpHeight);  	fread(pBmpBuf, 1, lineByte * bmpHeight, fp);  	fclose(fp);//关闭文件  	return 1;//读取文件成功 } //////----------------------------------- //----------------------------------------------------------------------------------------- //给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中 bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,  	int biBitCount, RGBQUAD *pColorTable)  {  	//如果位图数据指针为0，则没有数据传入，函数返回  	if (!imgBuf)  		return 0;  	//颜色表大小，以字节为单位，灰度图像颜色表为1024字节，彩色图像颜色表大小为0  	int colorTablesize = 0;  	if (biBitCount == 8)  		colorTablesize = 1024;  	//待存储图像数据每行字节数为4的倍数  	int lineByte = (width * biBitCount / 8 + 3) / 4 * 4;  	//以二进制写的方式打开文件  	FILE *fp = fopen(bmpName, "wb");  	if (fp == 0) return 0;  	//申请位图文件头结构变量，填写文件头信息  	BITMAPFILEHEADER fileHead;  	fileHead.bfType = 0x4D42;//bmp类型  							 //bfSize是图像文件4个组成部分之和  	fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)  		+ colorTablesize + lineByte*height;  	fileHead.bfReserved1 = 0;  	fileHead.bfReserved2 = 0;  	//bfOffBits是图像文件前3个部分所需空间之和  	fileHead.bfOffBits = 54 + colorTablesize;  	//写文件头进文件  	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);  	//申请位图信息头结构变量，填写信息头信息  	BITMAPINFOHEADER head;  	head.biBitCount = biBitCount;  	head.biClrImportant = 0;  	head.biClrUsed = 0;  	head.biCompression = 0;  	head.biHeight = height;  	head.biPlanes = 1;  	head.biSize = 40;  	head.biSizeImage = lineByte*height;  	head.biWidth = width;  	head.biXPelsPerMeter = 0;  	head.biYPelsPerMeter = 0;  	//写位图信息头进内存  	fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fp);  	//如果灰度图像，有颜色表，写入文件   	if (biBitCount == 8)  		fwrite(pColorTable, sizeof(RGBQUAD), 256, fp);  	//写位图数据进文件  	fwrite(imgBuf, height*lineByte, 1, fp);  	//关闭文件  	fclose(fp);  	return 1;  } /////---------------------------------------------------------- void xiang_su_du_qu()  {  	//读入指定BMP文件进内存  	char readPath[] = "2117.BMP";  	readBmp(readPath);  	//输出图像的信息  	//cout << "width=" << bmpWidth << " height=" << bmpHeight << " biBitCount=" << biBitCount << endl; 	printf("width=%d, height=%d, biBitCount=%d\n", bmpWidth, bmpHeight, biBitCount);  //具体类型你知道 	 	//循环变量，图像的坐标  	//每行字节数  	int lineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;  	//循环变量，针对彩色图像，遍历每像素的三个分量  	int m = 0, n = 0, count_xiang_su = 0;  	//将图像左下角1/4部分置成黑色  	//ofstream outfile("图像像素.txt", ios::in | ios::trunc); 对应如下两行C代码 	FILE *outfile; 	fopen("图像像素.txt", "r+");  	if (biBitCount == 8) //对于灰度图像 	{ 		//------------------------------------------------------------------------------------ 		//以下完成图像的分割成8*8小单元，并把像素值存储到指定文本中。由于BMP图像的像素数据是从 		//左下角：由左往右，由上往下逐行扫描的  		//int L2=0; 		//int fen_ge=8; 		for (int i = bmpHeight - 1; i >= 0; i--)//64*64矩阵行循环 		{ 			for (int j = 0; j<bmpWidth; j++)//64*64列矩阵循环 			{ 				//--------------------------------------------  				m = *(pBmpBuf + i*lineByte + j); 				//outfile << setw(4) << m; 				printf("%4d", m); 				// outfile<<m<<"  "; 				count_xiang_su = count_xiang_su + 1; 				if ((count_xiang_su) % (bmpWidth) == 0)// 				{ 					//outfile << endl; 					printf('\n'); 				} 			}  		} 	}  	//double xiang_su[2048]; 	//ofstream outfile("xiang_su_zhi.txt",ios::in|ios::trunc); 	if (!outfile) 	{ 		//cout << "open error!" << endl; 		printf("open error!\n"); 		exit(1); 	} 	else if (biBitCount == 24) {//彩色图像  		for (int i = 0; i<bmpHeight; i++) 		{  			for (int j = 0; j<bmpWidth; j++) 			{  				for (int k = 0; k<3; k++)//每像素RGB三个分量分别置0才变成黑色  				{ 					//*(pBmpBuf+i*lineByte+j*3+k)-=40; 					m = *(pBmpBuf + i*lineByte + j * 3 + k); 					//outfile << m << " "; 					printf("%d ", m); 					count_xiang_su++; 					if (count_xiang_su%bmpWidth == 0) 					{ 						//outfile << endl; 						printf('\n'); 					} 					//n++; 				} 				n++; 			}  		} 		//cout << "总的像素个素为:" << n << endl; 		printf("总的像素个素为:%d\n", n); 		//cout << "----------------------------------------------------" << endl; 		printf("----------------------------------------------------\n"); 	}  	//将图像数据存盘  	char writePath[] = "nvcpy.BMP";//图片处理后再存储  	saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);  	//清除缓冲区，pBmpBuf和pColorTable是全局变量，在文件读入时申请的空间  	//delete[]pBmpBuf; 	free(pBmpBuf);  	if (biBitCount == 8) 		//delete[]pColorTable; 		free(pColorTable);  } void main() { 	xiang_su_du_qu(); }