¶ÁÊéÈË

24λλͼת8λλͼʱµÄÎļþÍ·ÓйØÎÊÌâ

·¢²¼Ê±¼ä£º 2012-10-09 10:21:45 ×÷Õߣº rapoo

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

[½â¾ö°ì·¨]

̽ÌÖ
ÔÚÉú³ÉеÄλͼÊý¾Ýʱ£¬ÐÂͼÿÐÐËùÕ¼µÄ×Ö½ÚÊý±äÁË£¬Í¼Ïñ´óС±äÁË£¬ÄÇôÔÚ¹¹ÔìBITMAPFILEHEADER½á¹¹Ê±ËüµÄÄǸöbfSizeºÍbfOffBitsÔõôȷ¶¨£¿

[½â¾ö°ì·¨]
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   ); 

¶ÁÊéÈËÍø >VC/MFC

ÈȵãÍÆ¼ö