将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; }
相关文章推荐
- (tip_修订0618)bmp 32位转24位
- 实现1位,4位,8位,24位BMP位图的互相转换的方法,32位转24位
- 32位bmp图转24位bmp图
- BMP位图32位转为24位深度
- BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的
- 32位BMP带通道的透明图转化24位BMP带通道透明图问题
- BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的
- 把24位和32位BMP位图转为灰色bmp位图
- mfc制作32位透明bmp图标
- PHP识别24位BMP的验证码
- BMP图片格式。1,4,8,16,24位与windows分辨率没关系
- C/C++ BMP(24位真彩色)图像处理(1)------图像打开与数据区处理
- c++读取24位BMP图像并处理
- 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题
- 32位色与24位色
- 24位真彩位图转4位(16色)灰度图(BMP) .
- 将真彩色转换成增强色的方法(即RGB32位或RGB24位颜色转换成RGB16位颜色的函数)
- CPCL命令打印24位bmp
- C++8位和24位bmp位图平滑、锐化和二值处理,24位真彩图的灰度化
- 24位深的bmp图片转换为16位深RGB565格式的bmp图片源码