user-0 提问: c编程BMP模块，大神求解啊，完全不懂

回复:
user: user-1
content: 第六问你是不是写反了？在我的认知里，24bit-->8bit可比8bit-->24bit简单多了。 引用 8 楼 u012924596 的回复:[quote=引用 5 楼 赵4老师的回复:]MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  解析256色的代码MSDN98的例子代码里面有：  MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\PALETTE\*.* MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\SHOWDIB\*.* 第六问有具体的c程序吗[/quote]

user: user-0
content: 引用 9 楼 super_admi的回复:第六问你是不是写反了？在我的认知里，24bit-->8bit可比8bit-->24bit简单多了。 [quote=引用 8 楼 u012924596 的回复:] [quote=引用 5 楼 赵4老师的回复:]MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  解析256色的代码MSDN98的例子代码里面有：  MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\PALETTE\*.* MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\SHOWDIB\*.* 第六问有具体的c程序吗[/quote][/quote] 六问是把8位转为24位啊，有程序吗

user: user-0
content: 引用 5 楼 赵4老师的回复:MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  解析256色的代码MSDN98的例子代码里面有：  MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\PALETTE\*.* MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\SHOWDIB\*.* 第六问有具体的c程序吗

user: user-0
content: 第六问有具体的c程序吗

user: user-2
content: 用二进制打开文件, 跳过14字节,用这个头BITMAPINFOHEADER 读入,取出其中的biBitCount,如果是8就是256色, 如果是256, 接着256*4就是调色版

user: user-3
content: MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  解析256色的代码MSDN98的例子代码里面有：  MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\PALETTE\*.* MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\SHOWDIB\*.*

user: user-4
content: #include <Windows.h> #include <stdio.h>  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  struct MyRGB { 	BYTE b; 	BYTE g; 	BYTE r; };  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { 	TCHAR szAppName[] = TEXT("BMP_APP_CLASS"); 	HWND		hwnd; 	MSG			msg; 	WNDCLASS	wndClass; 	wndClass.style			= CS_HREDRAW|CS_VREDRAW; 	wndClass.lpfnWndProc	= WndProc; 	wndClass.cbClsExtra		= 0; 	wndClass.cbWndExtra		= 0; 	wndClass.hInstance		= hInstance; 	wndClass.hIcon			= LoadIcon(NULL, IDI_APPLICATION); 	wndClass.hCursor		= LoadCursor(NULL, IDC_ARROW); 	wndClass.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH); 	wndClass.lpszMenuName	= NULL; 	wndClass.lpszClassName	= szAppName; 	if(!RegisterClass(&wndClass)) 	{ 		MessageBox(NULL, TEXT("This program requires Windows NT!"), 						szAppName, MB_ICONERROR); 		return 0; 	} 	hwnd = ::CreateWindow(szAppName,  						"BMP图片解析程序", 						WS_OVERLAPPEDWINDOW, 						CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, 						NULL, NULL, hInstance, NULL); 	::ShowWindow(hwnd,iCmdShow); 	::UpdateWindow(hwnd); 	while(::GetMessage(&msg, NULL, 0,0)) 	{ 		::TranslateMessage(&msg); 		::DispatchMessage(&msg); 	} 	return msg.wParam; }  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { 	HDC				hdc; 	PAINTSTRUCT		ps; 	RECT			rect; 	COLORREF	color; 	char		fileName[] = "1.bmp"; 	FILE		*fp; 	BITMAPFILEHEADER		fileHeader; 	BITMAPINFOHEADER		infoHeader; 	WINDOWINFO				windInfo; 	char	   information[] = "打开不正确的bmp文件"; 	char	   tmpFileValue[4]; 	MyRGB   bmpData; 	int tmpValue = 0;  	switch(message) 	{ 	case WM_CREATE: 		/*if(fp == NULL) 		{ 			::GetWindowInfo(hwnd,&windInfo); 			TextOut(hdc, ) 		}*/ 		return 0; 	case WM_PAINT: 		hdc = ::BeginPaint(hwnd, &ps); 		fp = fopen(fileName, "rb"); 		if(fp == NULL) 		{ 			::TextOut(hdc, 0,0, information, strlen(information)); 			return 0; 		} 		fread(&fileHeader, sizeof(fileHeader), 1, fp); 		fread(&infoHeader, sizeof(infoHeader), 1, fp); 		tmpValue = (4-infoHeader.biWidth%4)%4; 		//bmpData = (MyRGB*)(malloc(sizeof(MyRGB)*infoHeader.biWidth)); 		for(int i=0; i<infoHeader.biHeight; i++) 		{ 			//fread(bmpData, sizeof(MyRGB)*infoHeader.biWidth, 1, fp); 			for(int j=0; j<infoHeader.biWidth; j++) 			{ 				fread(&bmpData, sizeof(MyRGB), 1, fp); 				::SetPixel(hdc, j,infoHeader.biHeight-i, RGB(bmpData.r,bmpData.g,bmpData.b)); 			} 			fread(tmpFileValue, tmpValue, 1, fp); 			/*for(int j=0; j<infoHeader.biWidth; j++) 			{ 				fread(&bmpData, sizeof(MyRGB), 1, fp); 				::SetPixel(hdc, i,j, RGB(bmpData.r,bmpData.g,bmpData.b)); 			}*/ 		} 		//free(bmpData); 		fclose(fp); 		::EndPaint(hwnd, &ps); 		return 0; 	case WM_DESTROY: 		PostQuitMessage(0); 		return 0; 	} 	return ::DefWindowProc(hwnd, message,wParam, lParam); } 我的代码只做了解析真彩色的工作。判断是否是256色，只要判断infoHeader的biBitCount字段是否为8。没写过解析256色的代码。

user: user-5
content: 引用 1 楼 u012924596 的回复:BMP文件模块				 	包含的功能有：			 	1、判定是否是256色BMP			 	2、读出256色BMP的调色板			 	3、读出256色BMP的图像数据			 	4、判定是否是24位色BMP			 	5、读出24位色BMP的图像数据			 	6、转换256色BMP为24位色BMP 先弄清bmp文件的每个字节的含义！

user: user-5
content: 了解了bmp文件的格式后，获取特定字节的值就可以判断

user: user-0
content: BMP文件模块				 	包含的功能有：			 	1、判定是否是256色BMP			 	2、读出256色BMP的调色板			 	3、读出256色BMP的图像数据			 	4、判定是否是24位色BMP			 	5、读出24位色BMP的图像数据			 	6、转换256色BMP为24位色BMP