2 4 8位BMP转24位BMP(代码)

//#include "stdafx.h"
#include <math.h>
#define WIDTHBYTE(bit)   ((  ( (bit)+31)/32 )*4)
#define _BITS_PER_PIXEL_24	24	
BOOL ConvertBmp4ToBmp24(const char* pSrcFile,const char* pDesFile)
{
    FILE* fpSrc = fopen(pSrcFile,"rb");
	if(fpSrc == NULL) return FALSE;
	
	// Read BITMAPFILEHEADER info
	BITMAPFILEHEADER bfh;
	fread(&bfh, 1, sizeof(BITMAPFILEHEADER), fpSrc);
	
	// Read BITMAPINFOHEADER info
	BITMAPINFOHEADER bih;
	fread(&bih, 1, sizeof(BITMAPINFOHEADER), fpSrc);
	
	const int iPitch = WIDTHBYTE(bih.biBitCount*bih.biWidth);


	if(bih.biBitCount == 4) //16 色
	{
		//转换为 24 位
		long _bpp = (_BITS_PER_PIXEL_24 >> 3);
		long _pitch = bih.biWidth * _bpp;
		while ((_pitch & 3) != 0)
			_pitch++;
		
		
		FILE* fpDes = fopen(pDesFile,"wb");
		if(fpDes == NULL)
		{
			fclose(fpSrc);
			return FALSE;
		}
		//24 bmp header
		BITMAPFILEHEADER bfh24 = bfh;
		BITMAPINFOHEADER bih24 = bih;
		DWORD dwSize = _pitch * bih.biHeight;
		bfh24.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize;
		bfh24.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
		bih24.biBitCount = _BITS_PER_PIXEL_24;
        fwrite(&bfh24,sizeof(BITMAPFILEHEADER),1,fpDes);
		fwrite(&bih24,sizeof(BITMAPINFOHEADER),1,fpDes);
		//end
		
		// Calculate palette entries
		int  iPaletteEntries = bih.biClrUsed;
		if (iPaletteEntries == 0)
			iPaletteEntries = 16;
		
		RGBQUAD lpPalette[256] = {0};
		// Read palette info
		fread(lpPalette, iPaletteEntries, sizeof(RGBQUAD), fpSrc);
		
		//Progress
// 		CProgressDlg dlg;//进度条
// 		dlg.Create();
// 		dlg.SetStep(1);
// 		dlg.SetPos(0);
// 		dlg.SetWindowText(_T("位图格式转换中..."));
		//分批读取数据 200 row
		const int oncerow = 200;
		const int times = bih.biHeight/oncerow;
		for(int i = 0;i<times;i++) //需要处理多少次
		{
			//dlg.SetPos( (1.0*i/times)*100);
			const DWORD dwSize = iPitch * oncerow;
			LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
			fread(lpData, dwSize, sizeof(BYTE), fpSrc);   
			
			// Create temporary bitmap
			const DWORD dw24Size = _pitch * oncerow;
			LPBYTE lp24Data = (LPBYTE)malloc(dw24Size*sizeof(BYTE));
			
			// Convert bitmap
			DWORD dwDstHorizontalOffset;
			DWORD dwDstVerticalOffset = 0;
			DWORD dwDstTotalOffset;
			
			DWORD dwSrcHorizontalOffset;
			DWORD dwSrcVerticalOffset = 0;
			DWORD dwSrcTotalOffset;
			
			for (long i=0; i<oncerow; i++) //每次转换 200 行
			{
				dwDstHorizontalOffset = 0;
				dwSrcHorizontalOffset = 0;
				for (long j=0; j<bih.biWidth; j++) //像素个数
				{
					// Update destination total offset
					dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
					
					// Update source total offset
					dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;
					
					//lpData[dwSrcTotalOffset]
					//第 j 个像素点
					//const int bitoffidx = 7 - j%8; //前 4 个字节的值
					//const int opreatenum = pow(2,bitoffidx);
					//int statevalue = (lpData[dwSrcTotalOffset]&opreatenum) >> bitoffidx;
					int statevalue = 0;
					if(j%2 == 0)
					{
                      statevalue = (lpData[dwSrcTotalOffset] & 0xf0) >> 4;
					}
					else
					{
                      statevalue = lpData[dwSrcTotalOffset] & 0x0f;
					}

					BYTE red = lpPalette[statevalue].rgbRed;
					BYTE green = lpPalette[statevalue].rgbGreen;
					BYTE blue = lpPalette[statevalue].rgbBlue;
					
					// Update bitmap
					lp24Data[dwDstTotalOffset+2] = red;
					lp24Data[dwDstTotalOffset+1] = green;
					lp24Data[dwDstTotalOffset] = blue;
					
					// Update destination horizontal offset
					dwDstHorizontalOffset += _bpp;
					
					// Update source horizontal offset
					dwSrcHorizontalOffset = (j+1)/2;
				}
				
				// Update destination vertical offset
				dwDstVerticalOffset += _pitch;
				
				// Update source vertical offset
				dwSrcVerticalOffset += iPitch;
			}
			fwrite(lp24Data,sizeof(BYTE),dw24Size,fpDes);
			delete[]  lp24Data;
		}
		//剩余不够 200 行的
		const int leftrow  = bih.biHeight%oncerow;
		//dlg.SetPos(100);
		if(leftrow > 0)
		{
			
			
			const DWORD dwSize = iPitch * leftrow;
			LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
			fread(lpData, dwSize, sizeof(BYTE), fpSrc);   
			
			// Create temporary bitmap
			const DWORD dw24Size = _pitch * leftrow;
			LPBYTE lp24Data = (LPBYTE)malloc(dw24Size*sizeof(BYTE));
			
			// Convert bitmap
			DWORD dwDstHorizontalOffset;
			DWORD dwDstVerticalOffset = 0;
			DWORD dwDstTotalOffset;
			
			DWORD dwSrcHorizontalOffset;
			DWORD dwSrcVerticalOffset = 0;
			DWORD dwSrcTotalOffset;
			
			
			for (long i=0; i<leftrow; i++) //每次转换 200 行
			{
				dwDstHorizontalOffset = 0;
				dwSrcHorizontalOffset = 0;
				for (long j=0; j<bih.biWidth; j++)
				{
					// Update destination total offset
					dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
					
					// Update source total offset
					dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;

					//star
					//const int bitoffidx = 7-j%8;
					//const int opreatenum = pow(2,bitoffidx);
					//int statevalue = (lpData[dwSrcTotalOffset]&opreatenum) >> bitoffidx;
					int statevalue = 0;
					if(j%2 == 0)
					{
						statevalue = (lpData[dwSrcTotalOffset] & 0xf0) >> 4;
					}
					else
					{
						statevalue = lpData[dwSrcTotalOffset] & 0x0f;
					}
					
					BYTE red = lpPalette[statevalue].rgbRed;
					BYTE green = lpPalette[statevalue].rgbGreen;
					BYTE blue = lpPalette[statevalue].rgbBlue;
					//end
									
					// Update bitmap
					lp24Data[dwDstTotalOffset+2] = red;
					lp24Data[dwDstTotalOffset+1] = green;
					lp24Data[dwDstTotalOffset] = blue;
					
					// Update destination horizontal offset
					dwDstHorizontalOffset += _bpp;
					
					// Update source horizontal offset
					dwSrcHorizontalOffset = (j+1)/2;
				}
				
				// Update destination vertical offset
				dwDstVerticalOffset += _pitch;
				
				// Update source vertical offset
				dwSrcVerticalOffset += iPitch;
			}
			fwrite(lp24Data,sizeof(BYTE),dw24Size,fpDes);
			delete[]  lp24Data;
		}
		fclose(fpSrc);
		fclose(fpDes);
		return TRUE;

	}
	else
	{
		fclose(fpSrc);
		return FALSE;
	}    
} 
BOOL ConvertBmp1ToBmp24(const char* pSrcFile,const char* pDesFile)
{
	FILE* fpSrc = fopen(pSrcFile,"rb");
	if(fpSrc == NULL) return FALSE;
	
	// Read BITMAPFILEHEADER info
	BITMAPFILEHEADER bfh;
	fread(&bfh, 1, sizeof(BITMAPFILEHEADER), fpSrc);
	
	// Read BITMAPINFOHEADER info
	BITMAPINFOHEADER bih;
	fread(&bih, 1, sizeof(BITMAPINFOHEADER), fpSrc);
	
	const int iPitch = WIDTHBYTE(bih.biBitCount*bih.biWidth);


	if(bih.biBitCount == 1) //黑白图
	{
		//转换为 24 位
		long _bpp = (_BITS_PER_PIXEL_24 >> 3);
		long _pitch = bih.biWidth * _bpp;
		while ((_pitch & 3) != 0)
			_pitch++;
		
		
		FILE* fpDes = fopen(pDesFile,"wb");
		if(fpDes == NULL)
		{
			fclose(fpSrc);
			return FALSE;
		}
		//24 bmp header
		BITMAPFILEHEADER bfh24 = bfh;
		BITMAPINFOHEADER bih24 = bih;
		DWORD dwSize = _pitch * bih.biHeight;
		bfh24.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize;
		bfh24.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
		bih24.biBitCount = _BITS_PER_PIXEL_24;
        fwrite(&bfh24,sizeof(BITMAPFILEHEADER),1,fpDes);
		fwrite(&bih24,sizeof(BITMAPINFOHEADER),1,fpDes);
		//end
		
		// Calculate palette entries
		int  iPaletteEntries = bih.biClrUsed;
		if (iPaletteEntries == 0)
			iPaletteEntries = 2;
		
		RGBQUAD lpPalette[256] = {0};
		// Read palette info
		fread(lpPalette, iPaletteEntries, sizeof(RGBQUAD), fpSrc);
		
// 		//Progress
// 		CProgressDlg dlg;//进度条
// 		dlg.Create();
// 		dlg.SetStep(1);
// 		dlg.SetPos(0);
// 		dlg.SetWindowText(_T("位图格式转换中..."));
		//分批读取数据 200 row
		const int oncerow = 200;
		const int times = bih.biHeight/oncerow;
		for(int i = 0;i<times;i++) //需要处理多少次
		{
			//dlg.SetPos( (1.0*i/times)*100);
			const DWORD dwSize = iPitch * oncerow;
			LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
			fread(lpData, dwSize, sizeof(BYTE), fpSrc);   
			
			// Create temporary bitmap
			const DWORD dw24Size = _pitch * oncerow;
			LPBYTE lp24Data = (LPBYTE)malloc(dw24Size*sizeof(BYTE));
			
			// Convert bitmap
			DWORD dwDstHorizontalOffset;
			DWORD dwDstVerticalOffset = 0;
			DWORD dwDstTotalOffset;
			
			DWORD dwSrcHorizontalOffset;
			DWORD dwSrcVerticalOffset = 0;
			DWORD dwSrcTotalOffset;
			
			for (long i=0; i<oncerow; i++) //每次转换 200 行
			{
				dwDstHorizontalOffset = 0;
				dwSrcHorizontalOffset = 0;
				for (long j=0; j<bih.biWidth; j++) //像素个数
				{
					// Update destination total offset
					dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
					
					// Update source total offset
					dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;
					
					//lpData[dwSrcTotalOffset]
					//第 j 个像素点
					const int bitoffidx = 7 - j%8;
					const int opreatenum = pow(2,bitoffidx);
					int statevalue = (lpData[dwSrcTotalOffset]&opreatenum) >> bitoffidx;

					BYTE red = lpPalette[statevalue].rgbRed;
					BYTE green = lpPalette[statevalue].rgbGreen;
					BYTE blue = lpPalette[statevalue].rgbBlue;
					
					// Update bitmap
					lp24Data[dwDstTotalOffset+2] = red;
					lp24Data[dwDstTotalOffset+1] = green;
					lp24Data[dwDstTotalOffset] = blue;
					
					// Update destination horizontal offset
					dwDstHorizontalOffset += _bpp;
					
					// Update source horizontal offset
					dwSrcHorizontalOffset = (j+1)/8;
				}
				
				// Update destination vertical offset
				dwDstVerticalOffset += _pitch;
				
				// Update source vertical offset
				dwSrcVerticalOffset += iPitch;
			}
			fwrite(lp24Data,sizeof(BYTE),dw24Size,fpDes);
			delete[]  lp24Data;
		}
		//剩余不够 200 行的
		const int leftrow  = bih.biHeight%oncerow;
		//dlg.SetPos(100);
		if(leftrow > 0)
		{
			
			
			const DWORD dwSize = iPitch * leftrow;
			LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
			fread(lpData, dwSize, sizeof(BYTE), fpSrc);   
			
			// Create temporary bitmap
			const DWORD dw24Size = _pitch * leftrow;
			LPBYTE lp24Data = (LPBYTE)malloc(dw24Size*sizeof(BYTE));
			
			// Convert bitmap
			DWORD dwDstHorizontalOffset;
			DWORD dwDstVerticalOffset = 0;
			DWORD dwDstTotalOffset;
			
			DWORD dwSrcHorizontalOffset;
			DWORD dwSrcVerticalOffset = 0;
			DWORD dwSrcTotalOffset;
			
			
			for (long i=0; i<leftrow; i++) //每次转换 200 行
			{
				dwDstHorizontalOffset = 0;
				dwSrcHorizontalOffset = 0;
				for (long j=0; j<bih.biWidth; j++)
				{
					// Update destination total offset
					dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
					
					// Update source total offset
					dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;

					//star
					const int bitoffidx = 7-j%8;
					const int opreatenum = pow(2,bitoffidx);
					int statevalue = (lpData[dwSrcTotalOffset]&opreatenum) >> bitoffidx;
					
					BYTE red = lpPalette[statevalue].rgbRed;
					BYTE green = lpPalette[statevalue].rgbGreen;
					BYTE blue = lpPalette[statevalue].rgbBlue;
					//end
									
					// Update bitmap
					lp24Data[dwDstTotalOffset+2] = red;
					lp24Data[dwDstTotalOffset+1] = green;
					lp24Data[dwDstTotalOffset] = blue;
					
					// Update destination horizontal offset
					dwDstHorizontalOffset += _bpp;
					
					// Update source horizontal offset
					dwSrcHorizontalOffset = (j+1)/8;
				}
				
				// Update destination vertical offset
				dwDstVerticalOffset += _pitch;
				
				// Update source vertical offset
				dwSrcVerticalOffset += iPitch;
			}
			fwrite(lp24Data,sizeof(BYTE),dw24Size,fpDes);
			delete[]  lp24Data;
		}
		fclose(fpSrc);
		fclose(fpDes);
		return TRUE;

	}
	else
	{
		fclose(fpSrc);
		return FALSE;
	}
}
BOOL ConvertBmp8ToBmp24(const char* pSrcFile,const char* pDesFile)
{
	FILE* fpSrc = fopen(pSrcFile,"rb");
	if(fpSrc == NULL) return FALSE;
	
	// Read BITMAPFILEHEADER info
	BITMAPFILEHEADER bfh;
	fread(&bfh, 1, sizeof(BITMAPFILEHEADER), fpSrc);
	
	// Read BITMAPINFOHEADER info
	BITMAPINFOHEADER bih;
	fread(&bih, 1, sizeof(BITMAPINFOHEADER), fpSrc);
	
	// Calculate pitch
	const int iBpp = bih.biBitCount >> 3;
	int iPitch = iBpp * bih.biWidth;
	while ((iPitch & 3) != 0)
		iPitch++;	
	if (bih.biBitCount == 8)
	{
		//转换为 24 位
		long _bpp = (_BITS_PER_PIXEL_24 >> 3);
		long _pitch = bih.biWidth * _bpp;
		while ((_pitch & 3) != 0)
			_pitch++;
		
		
		FILE* fpDes = fopen(pDesFile,"wb");
		if(fpDes == NULL)
		{
			fclose(fpSrc);
			return FALSE;
		}
		//24 bmp header
		BITMAPFILEHEADER bfh24 = bfh;
		BITMAPINFOHEADER bih24 = bih;
		DWORD dwSize = _pitch * bih.biHeight;
		bfh24.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize;
		bfh24.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
		bih24.biBitCount = _BITS_PER_PIXEL_24;
        fwrite(&bfh24,sizeof(BITMAPFILEHEADER),1,fpDes);
		fwrite(&bih24,sizeof(BITMAPINFOHEADER),1,fpDes);
		//end
		
		// Calculate palette entries
		int  iPaletteEntries = bih.biClrUsed;
		if (iPaletteEntries == 0)
			iPaletteEntries = 256;
		
		RGBQUAD lpPalette[256] = {0};
		// Read palette info
		fread(lpPalette, iPaletteEntries, sizeof(RGBQUAD), fpSrc);
		
		//Progress
// 		CProgressDlg dlg;//进度条
// 		dlg.Create();
// 		dlg.SetStep(1);
// 		dlg.SetPos(0);
// 	    dlg.SetWindowText(_T("位图格式转换中..."));
		//分批读取数据 200 row
		const int oncerow = 200;
		const int times = bih.biHeight/oncerow;
		for(int i = 0;i<times;i++) //需要处理多少次
		{
			//dlg.SetPos( (1.0*i/times)*100);
			const DWORD dwSize = iPitch * oncerow;
			LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
			fread(lpData, dwSize, sizeof(BYTE), fpSrc);   
			
			
			
			
			// Create temporary bitmap
			const DWORD dw24Size = _pitch * oncerow;
			LPBYTE lp24Data = (LPBYTE)malloc(dw24Size*sizeof(BYTE));
			
			// Convert bitmap
			DWORD dwDstHorizontalOffset;
			DWORD dwDstVerticalOffset = 0;
			DWORD dwDstTotalOffset;
			
			DWORD dwSrcHorizontalOffset;
			DWORD dwSrcVerticalOffset = 0;
			DWORD dwSrcTotalOffset;
			
			for (long i=0; i<oncerow; i++) //每次转换 200 行
			{
				dwDstHorizontalOffset = 0;
				dwSrcHorizontalOffset = 0;
				for (long j=0; j<bih.biWidth; j++)
				{
					// Update destination total offset
					dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
					
					// Update source total offset
					dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;
					
					BYTE red = lpPalette[lpData[dwSrcTotalOffset]].rgbRed;
					BYTE green = lpPalette[lpData[dwSrcTotalOffset]].rgbGreen;
					BYTE blue = lpPalette[lpData[dwSrcTotalOffset]].rgbBlue;
					
					// Update bitmap
					lp24Data[dwDstTotalOffset+2] = red;
					lp24Data[dwDstTotalOffset+1] = green;
					lp24Data[dwDstTotalOffset] = blue;
					
					// Update destination horizontal offset
					dwDstHorizontalOffset += _bpp;
					
					// Update source horizontal offset
					dwSrcHorizontalOffset += iBpp;
				}
				
				// Update destination vertical offset
				dwDstVerticalOffset += _pitch;
				
				// Update source vertical offset
				dwSrcVerticalOffset += iPitch;
			}
			fwrite(lp24Data,sizeof(BYTE),dw24Size,fpDes);
			delete[]  lp24Data;
		}
		//剩余不够 200 行的
		const int leftrow  = bih.biHeight%oncerow;
		//dlg.SetPos(100);
		if(leftrow > 0)
		{
			
			
			const DWORD dwSize = iPitch * leftrow;
			LPBYTE lpData = (LPBYTE)malloc(dwSize*sizeof(BYTE));
			fread(lpData, dwSize, sizeof(BYTE), fpSrc);   
			
			
			
			
			// Create temporary bitmap
			const DWORD dw24Size = _pitch * leftrow;
			LPBYTE lp24Data = (LPBYTE)malloc(dw24Size*sizeof(BYTE));
			
			// Convert bitmap
			DWORD dwDstHorizontalOffset;
			DWORD dwDstVerticalOffset = 0;
			DWORD dwDstTotalOffset;
			
			DWORD dwSrcHorizontalOffset;
			DWORD dwSrcVerticalOffset = 0;
			DWORD dwSrcTotalOffset;
			
			
			for (long i=0; i<leftrow; i++) //每次转换 200 行
			{
				dwDstHorizontalOffset = 0;
				dwSrcHorizontalOffset = 0;
				for (long j=0; j<bih.biWidth; j++)
				{
					// Update destination total offset
					dwDstTotalOffset = dwDstVerticalOffset + dwDstHorizontalOffset;
					
					// Update source total offset
					dwSrcTotalOffset = dwSrcVerticalOffset + dwSrcHorizontalOffset;
					
					BYTE red = lpPalette[lpData[dwSrcTotalOffset]].rgbRed;
					BYTE green = lpPalette[lpData[dwSrcTotalOffset]].rgbGreen;
					BYTE blue = lpPalette[lpData[dwSrcTotalOffset]].rgbBlue;
					
					// Update bitmap
					lp24Data[dwDstTotalOffset+2] = red;
					lp24Data[dwDstTotalOffset+1] = green;
					lp24Data[dwDstTotalOffset] = blue;
					
					// Update destination horizontal offset
					dwDstHorizontalOffset += _bpp;
					
					// Update source horizontal offset
					dwSrcHorizontalOffset += iBpp;
				}
				
				// Update destination vertical offset
				dwDstVerticalOffset += _pitch;
				
				// Update source vertical offset
				dwSrcVerticalOffset += iPitch;
			}
			fwrite(lp24Data,sizeof(BYTE),dw24Size,fpDes);
			delete[]  lp24Data;
		}
		fclose(fpSrc);
		fclose(fpDes);
		return TRUE;
	}
	else
	{
		fclose(fpSrc);
		return FALSE;
	}
}
转载 :http://download.csdn.net/detail/ccxbb/6022487
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法生成代码。但是,你可以使用以下代码生成一个简单的8位BMP图像: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma pack(push,1) typedef struct { unsigned short type; unsigned int size; unsigned short reserved1, reserved2; unsigned int offset; } BMPHeader; typedef struct { unsigned int size; int width, height; unsigned short planes; unsigned short bitsPerPixel; unsigned int compression; unsigned int imageSize; int xPixelsPerMeter, yPixelsPerMeter; unsigned int colorsUsed; unsigned int colorsImportant; } BMPInfoHeader; #pragma pack(pop) void writeBMP(char* filename, unsigned char* data, int width, int height) { BMPHeader header; BMPInfoHeader infoHeader; FILE* file = fopen(filename, "wb"); memset(&header, 0, sizeof(header)); memset(&infoHeader, 0, sizeof(infoHeader)); header.type = 0x4D42; header.offset = sizeof(header) + sizeof(infoHeader) + 256 * 4; infoHeader.size = sizeof(infoHeader); infoHeader.width = width; infoHeader.height = -height; infoHeader.planes = 1; infoHeader.bitsPerPixel = 8; infoHeader.imageSize = width * height; infoHeader.colorsUsed = 256; infoHeader.colorsImportant = 256; fwrite(&header, sizeof(header), 1, file); fwrite(&infoHeader, sizeof(infoHeader), 1, file); for (int i = 0; i < 256; i++) { unsigned char color[4] = { i, i, i, 0 }; fwrite(color, sizeof(color), 1, file); } fwrite(data, width * height, 1, file); fclose(file); } int main() { unsigned char data[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 }; writeBMP("test.bmp", data, 8, 8); return 0; } ``` 这个程序会生成一个8x8的灰度图像,颜色值为0到255。你可以根据你的需求修改这个程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值