24λλͼת8λλͼʱµÄÎļþÍ·ÎÊÌâ
ÎÒµÄÒ»¸ö³ÌÐòÖÐÐèÒª½«Ò»¸ö24λλͼתΪ8λλͼºó±£´æ£¬ÎÒµÄ˼·ÊÇÔÚ¶ÁÈ¡ÔͼºóµÃµ½ÔͼµÄͼÏñÊý¾Ý£¬È»ºóÖØÐÂÉêÇëÄÚ´æ¿Õ¼ä£¬¹¹ÔìеÄBITMAPFILEHEADERºÍBITMAPINFOR½á¹¹£¬Àï±ß°üÀ¨BITMAPINFOHEADERºÍÑÕÉ«±í£¬Ö®ºóÊǽô¸úеÄλͼÐÅÏ¢£¬È»ºóÔÙ±£´æ¡£ÎÒµÄ˼·¶Ô²»¶Ô£¿ÓÐûÓиüºÃµÄ·½·¨£¿ÔÚÉú³ÉеÄλͼÊý¾Ýʱ£¬ÐÂͼÿÐÐËùÕ¼µÄ×Ö½ÚÊý±äÁË£¬Í¼Ïñ´óС±äÁË£¬ÄÇôÔÚ¹¹ÔìBITMAPFILEHEADER½á¹¹Ê±ËüµÄÄǸöbfSizeºÍbfOffBitsÔõôȷ¶¨£¿
[½â¾ö°ì·¨]
ÄãÕâÆäʵ¾ÍÊÇת»»³É»Ò¶ÈͼÏ󣬾Ͱ´ÄãµÄ˼·Ū¾ÍÐУ¬Ö»²»¹ý°Ñ¸÷¸öÏóËØÖµÖØÐ¼ÆËãһϣ¬ÓÃ(R+G+B)/3´úÌæ¼´¿É¡£
[½â¾ö°ì·¨]
bfsize²»¾ÍÊÇ width*height ô£¿
bfOffBits»Ò¶ÈÊý¾ÝÆðʼµØÖ·Ó¦¸Ãûʲô±ä»¯°É
Õæ²ÊµÄ255*255*255 size = 3 * width * height,»Ò¶ÈÕ¼Ò»¸öbyte£¬0~255
[½â¾ö°ì·¨]
[½â¾ö°ì·¨]
LZÎÒÏëÄã˵µÄ8λλͼӦ¸ÃÊÇ 8λ²ÊÉ«£¨256É«£©¶ø²»ÊÇ256»Ò¶È°É£¿
ûÀí½â´í°É£¿
[½â¾ö°ì·¨]
ͼÏñ´óСû±ä£¬bfSizeÊÇÎļþµÄ´óС£¬Ò²¾ÍÊÇÎļþÍ·¼ÓÉÏÑÕÉ«±í¼ÓÉÏλͼÊý¾ÝµÄ´óС£»bfOffBitsÊÇλͼÊý¾ÝµÄ¿ªÊ¼Î»Öã¬Ò²¾ÍÊÇÎļþÍ·¼ÓÉÏÑÕÉ«±íµÄ´óС¡£
[½â¾ö°ì·¨]
- C/C++ code
HANDLE hFile = ::CreateFile("E:\\bitmap.bmp",GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == 0) { MessageBox("²»ÄÜ´ò¿ªÎļþ£¬ÇëÖØÐÂÑ¡Ôñ!"); } DWORD dwWriteNum; BITMAPFILEHEADER Bmp_file_head; //ÎļþÍ· ReadFile(hFile,&Bmp_file_head,14,&dwWriteNum,NULL);//¶ÁÈ¡ÎļþÍ·,¹²14¸ö×Ö½Ú if((Bmp_file_head.bfType != 'MB')||(dwWriteNum != sizeof(BITMAPFILEHEADER))) { MessageBox("²»ÊÇBMPλͼÎļþ»òÊý¾ÝÓÐÎó!"); } BITMAPINFOHEADER Bmp_info_head; //ÐÅϢͷ ReadFile(hFile,&Bmp_info_head,40,&dwWriteNum,NULL); if(dwWriteNum != sizeof(BITMAPINFOHEADER)) { MessageBox("¶ÁÈ¡ÐÅϢͷ´íÎó!"); } //¶ÁÈ¡24λͼÏñËØÊý¾Ý DWORD Bitmap_bit_len; Bitmap_bit_len = Bmp_file_head.bfSize-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER); BYTE *lpOldBmpData = new BYTE[Bitmap_bit_len]; ReadFile(hFile,lpOldBmpData,Bitmap_bit_len,&dwWriteNum,NULL); if(dwWriteNum != Bitmap_bit_len) { MessageBox("λͼÏñËØÊý¾Ý¶ÁÈ¡´íÎó!"); } int nScanWidth; //ת»»ºóÆäÿÐÐɨÃè¿í¶È int nLineWidth; //½«Æäת»»³É8λλͼºóÿÐпí¶È(¼´Ã¿ÐÐ×Ö½ÚÊý) int nSrcWidth,nSrcHeight; nSrcHeight = Bmp_info_head.biHeight; //Ô24λλͼ¸ß¶È(ÏñËØÊý) nSrcWidth = Bmp_info_head.biWidth; //Ô24λλͼ¿í¶È(ÏñËØÊý) nLineWidth = ((nSrcWidth*3)/4)*4; if(nLineWidth<nSrcWidth*3) nLineWidth=nLineWidth+4; //±£Ö¤ÒÔDWORD¶ÔÆë(Ϊ4µÄÕûÊý±¶)(ÔͼÏóÿÐÐ×Ö½ÚÊý) nScanWidth=(nSrcWidth/4)*4; if(nScanWidth<nSrcWidth) nScanWidth=nScanWidth+4; //±£Ö¤ÒÔDWORD¶ÔÆë(Ϊ4µÄÕûÊý±¶)(ת»»Í¼ÏóÿÐÐÏñËØÊý) //ÉêÇë8λͼµÄ¿Õ¼ä int intnDataLen = nScanWidth*nSrcHeight;//+2; //ÔͼÏñËØÊý BYTE * lpNewBmpData = new BYTE[intnDataLen]; //Ϊ8λλͼÏñËØ¸³Öµ for(int i=0;i<nSrcHeight;i++) //ÏñËØ { for(int j=0;j<nSrcWidth;j++) //ÏñËØ { BYTE color[3]; unsigned int dwColorTemp; for(int s=0; s<3; s++) color[s]=lpOldBmpData[i*nLineWidth+j*3+s]; dwColorTemp=unsigned int(color[2]*0.299+color[1]*0.587+color[0]*0.114); if(dwColorTemp>255) dwColorTemp=255; if( dwColorTemp< 0 ) dwColorTemp = 0; //***************the problem is here****************************// lpNewBmpData[i*nScanWidth+j]=(unsigned char)dwColorTemp; } } //ÉèÖÃ8λλͼµ÷É«°å RGBQUAD *rgbQuad = new RGBQUAD[256]; for(i=0;i<256;i++) { rgbQuad[i].rgbBlue = i; rgbQuad[i].rgbGreen = i; rgbQuad[i].rgbRed = i; rgbQuad[i].rgbReserved = 0; } //ÉèÖÃ8λλͼÎļþÍ· BITMAPFILEHEADER Bmp_new_file_head; Bmp_new_file_head.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD); Bmp_new_file_head.bfReserved1 = Bmp_file_head.bfReserved1; Bmp_new_file_head.bfReserved2 = Bmp_file_head.bfReserved2; Bmp_new_file_head.bfType = Bmp_file_head.bfType; Bmp_new_file_head.bfSize = Bmp_new_file_head.bfOffBits+intnDataLen; //ÉèÖÃ8λλͼÐÅϢͷ Bmp_info_head.biBitCount=8; //¹Ø±Õ24λλͼÎļþ if( !CloseHandle( hFile ) ) MessageBox("¹Ø±ÕÎļþʱʧ°Ü"); HANDLE hSaveFile = CreateFile("E:\\bitmap_8.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if( !hSaveFile ) { MessageBox( "´´½¨Îļþ³ö´í"); } //дλͼÎļþÍ· WriteFile( hSaveFile, &Bmp_new_file_head, sizeof(BITMAPFILEHEADER), &dwWriteNum, NULL); //дλͼÐÅϢͷ WriteFile( hSaveFile, &Bmp_info_head, sizeof(BITMAPINFOHEADER), &dwWriteNum, NULL); //дλͼµ÷É«°å WriteFile( hSaveFile, rgbQuad, 256*sizeof(RGBQUAD), &dwWriteNum, NULL); //дλͼÏñËØÊý¾Ý WriteFile( hSaveFile, lpNewBmpData, intnDataLen, &dwWriteNum, NULL); //¹Ø±Õ8λλͼ CloseHandle( hSaveFile );