2 4 8位BMP转24位BMP(代码)
2014-02-17 19:14
204 查看
//#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
相关文章推荐
- 24位和8位BMP图片保存纯C代码
- 24位BMP转8位BMP
- bmp位图文件:读取、写入、24位真彩转8位灰度、灰度图的二值化
- 24位真彩色位图转换成8位灰度图片的代码实现
- 24位真彩色位图转换成8位灰度图片的代码实现
- bmp24位彩色图像转8位灰度图像(纯C++)
- OpenGL纹理贴图24位bmp图片,代码如下
- 实现1位,4位,8位,24位BMP位图的互相转换的方法,32位转24位
- 【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化
- C++8位和24位bmp位图平滑、锐化和二值处理,24位真彩图的灰度化
- C#的bitMap类.bmp图像 8位转24位 和 24位转8位
- BMP的8位位图转换24位位图
- 24位位图转化为8位位图 位图头部信息BITMAPFILEHEADER BITMAPINFOHEADER修改代码
- 8位位图转换成24位位图
- 24位转8位位图,不是灰度,有颜色的,尽量减少失真
- 24位真彩色转换为8位灰度图片(完整代码)
- 一个截屏程序,最后以BMP文件的形式保存,VC代码
- 8位灰度图像BMP的保存
- BMP图片文件加密代码
- jpeg转bmp实现c代码