您的位置:首页 > 其它

将32位BMP文件转换为24位BMP

2013-02-04 17:25 525 查看
#include "stdafx.h"
#include <windows.h>
#include <malloc.h>

BYTE* ConvertBmp32To24(BYTE* bmp32, DWORD& out_size)
{
BITMAPFILEHEADER* lpfi = (BITMAPFILEHEADER*)bmp32;
BITMAPINFOHEADER* lpbi = (BITMAPINFOHEADER*)(bmp32 + sizeof(BITMAPFILEHEADER));

//颜色空间转换,如果为32位位图,转换为24
DWORD dwSize32 = lpfi->bfSize - (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
DWORD dwSize24 = (dwSize32 * 3) / 4;   //RGB32与RGB24的像素点空间差一个字节

BYTE* pImg24 = new BYTE[dwSize24 + (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER))];	//存放RGB24存储空间
BYTE* pImg24Temp = pImg24;			//设定临时指针,后续进行数据管理

//进行文件头设置
lpfi->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize24;
lpfi->bfReserved1 = 0;
lpfi->bfReserved2 = 0;
lpfi->bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + lpbi->biSize);

lpbi->biBitCount = 24;//强行指定
lpbi->biSizeImage = dwSize24;	// 数据内容大小

// 复制文件头到新数据区域
memcpy(pImg24, lpfi, sizeof(BITMAPFILEHEADER));
pImg24 += sizeof(BITMAPFILEHEADER);

memcpy(pImg24, lpbi, sizeof(BITMAPINFOHEADER));
pImg24 += sizeof(BITMAPINFOHEADER);

BYTE* pImg32 = bmp32 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//跳过文件头,定位到数据部分
for (DWORD index=0; index < dwSize32 / 4; index++)
{
unsigned char r = *(pImg32++);
unsigned char g = *(pImg32++);
unsigned char b = *(pImg32++);
pImg32++;    //跳过颜色空间alpha分量,实现转换
*(pImg24++) = r;
*(pImg24++) = g;
*(pImg24++) = b;   //赋值
}

out_size = lpfi->bfSize;
return pImg24Temp;
}

int _tmain(int argc, _TCHAR* argv[])
{
FILE* pf = fopen("d:\\002.bmp", "rb");

int templen = 3 * 1024 * 1024;
BYTE* pTemp = (BYTE*)malloc(templen);
int len = fread(pTemp, 1, templen, pf);
BYTE* bmp32 = (BYTE*)malloc(len);
memcpy(bmp32, pTemp, len);
free(pTemp);
fclose(pf);

DWORD dwSize24 = 0;
BYTE* pImg24 = ConvertBmp32To24(bmp32, dwSize24);

//进行位图写入
FILE *bmpFile = NULL;
bmpFile = fopen("d:\\241.bmp", "wb");//szFile为文件名
if (bmpFile != NULL)
{
fwrite(pImg24, 1, dwSize24, bmpFile);
}
fclose(bmpFile);
delete[] pImg24;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: