Î÷Î÷Èí¼þÔ°¶àÖØ°²È«¼ì²âÏÂÔØÍøÕ¾¡¢ÖµµÃÐÅÀµµÄÈí¼þÏÂÔØÕ¾£¡
Î÷Î÷Ê×Ò³ °²×¿Èí¼þ °²×¿ÓÎÏ· µçÄÔÈí¼þ Èí¼þ½Ì³Ì רÌâºÏ¼¯

BMP 24λͼת16λλͼµÄ³ÌÐò

ÂÌÉ«Ãâ·Ñ°æ
  • BMP 24λͼת16λλͼµÄ³ÌÐòÂÌÉ«Ãâ·Ñ°æ
  • Èí¼þÀàÐÍ:¹ú²úÈí¼þ / Ãâ·ÑÈí¼þ
  • Èí¼þ´óС:827KB
  • ¸üÐÂʱ¼ä:2015-05-27 17:24
  • Ó¦ÓÃÆ½Ì¨:WinXP
  • Èí¼þÓïÑÔ:ÖÐÎÄ
  • Èí¼þµÈ¼¶:3¼¶
  • ¹Ù·½ÍøÕ¾:http://www.cr173.com
5.0
0
ºÃÓÃ
0
ÄÑÓÃ
  • Èí¼þ¼ò½é
  • Èí¼þ½ØÍ¼
  • Èí¼þÆÀÂÛ
  • Èí¼þÍÆ¼ö

24λBMPͼƬת565¸ñʽ16λÊý×éCÎļþ´úÂ룬Éú³ÉµÄ´úÂëÓÃÓÚǶÈëʽ³ÌÐò´úÂëÖÐͼƬÎļþÏÔʾ£¬BMPͼƬÒÔÊý×éµÄÐÎʽ±£´æ²¢¶ÁÈ¡,½«24λλͼ¸ñʽת»»Îª16λλͼ¸ñʽµÄÔ´´úÂ룬°üÀ¨RGB555¸ñʽºÍRGB565¸ñʽ¡£

BMPλͼ32λתΪ24λÉî¶È

°ïÅóÓÑ×öÒ»¸öÊÓÆµ²É¼¯ºÍ»ù±¾´¦Àí¹¦ÄÜ£¬ÒªÇóµÄÊÇ.bmp¸ñʽ

¼¸ÌìÏÂÀ´£¬Í¨¹ýdirectshow½øÐÐÊÓÆµ²É¼¯£¬²¢×¥È¥Í¼Æ¬±£´æ£¬°´ÕÕÒªÇó½øÐÐÒµÎñ´¦Àí£¬ÒÔǰµÄ´¦Àí³ÌÐòÊÇ»ùÓÚRGB24

¶øÏÔʾÆ÷ÊÇ32Î»Õæ²ÊÉ«£¬ºóµ÷Õûdirectshow µÄgrab filter£¬ÐÞ¸ÄýÌåÀàÐÍ£¬pmt->majortype = MEDIATYPE_Video;
 pmt->subtype = MEDIASUBTYPE_RGB24; ½á¹ûÔÚÒµÎñÖÐЧ¹û²»ÀíÏ룬Ϊ¼È±£Áô32λͼ£¬Ò²Éú³Érgb24λͼ

Ó²Êǽ«BITMAPINFOHEADER *lpbi ÖеÄÖµ½øÐÐÇ¿ÐÐÉèÖÃlpbi->biBitCount = 24;

½á¹ûÊÇ£º²úÉúµÄͼƬ´øÓмä¶ÏÐԵIJÊÉ«ÌõÎÆ

È»ºóÔÙÔڹȸ衢°Ú¶ÉÖмÌÐøÓÎÓ¾£¬Ã»ÓÐʵÖÊÐÔ½øÕ¹

ÎÞÄΣ¬½øÎ¢Èímsdn¡¢gdi+...

½ÓÏÂÀ´µÄÁ½Ìì¾ÍÊǶñ²¹BMP֪ʶ£¬·¢ÏÖ²ÊÉ«ÌõÎÆÓ¦¸ÃÊÇRGB32λÑÕÉ«¿Õ¼äÖµ£¬¶ÔÓÚRGB32ÓëRGB24£¬ËüÃǵÄÏñËØµã¿Õ¼äÖ»²îÁËÒ»¸ö×Ö½Ú£¬

¼Ì¶ø£¬×ÔÐÐת»»Êý¾Ý

Ê×ÏÈÊÇ´ÓdirectshowÖлñȡͼÏñÊý¾Ý

Æä´ÎÊÇ£¬±£Áô»ñÈ¡Êý¾ÝµÄÎļþÍ·

È»ºóÊÇת»»Î»Í¼Êý¾ÝÄÚÈÝ£¬²¢½«ÄÚÈÝÁíÖÿռä

×îºóÉ趨BITMAPFILEHEADERÎļþÍ·£¬²¢Ð´Îļþ£¬

Ϊ±¸Íü£¬¾ßÌåʵÏÖÈçÏ£º

 TRY 
 {
 
  BYTE *buffer = NULL; 
  hr = m_pWindowsLessControl->GetCurrentImage(&buffer); //ÕâÀï m_pWindowsLessControlΪIVMRWindowlessControl£¬½øÐÐͼÏñץȡ;
  if (!SUCCEEDED(hr)) 
  {     
   return hr;
  }
 
  BITMAPFILEHEADER hdr;     
  BITMAPINFOHEADER *lpbi = (BITMAPINFOHEADER *)buffer; 
 
  //ÑÕÉ«¿Õ¼äת»»£¬Èç¹ûΪ32λλͼ£¬×ª»»Îª24
  DWORD dwSize24 = 0;
  DWORD dwSize32 = lpbi->biSizeImage;
  dwSize24 = (dwSize32*3)/4;   //RGB32ÓëRGB24µÄÏñËØµã¿Õ¼ä²îÒ»¸ö×Ö½Ú
  BYTE* pImg24 = new BYTE[dwSize24]; //´æ·ÅRGB24´æ´¢¿Õ¼ä
  BYTE* pImg24Temp = pImg24;//É趨ÁÙʱָÕ룬ºóÐø½øÐÐÊý¾Ý¹ÜÀí
  BYTE* pImg32 = buffer + sizeof(BITMAPINFOHEADER);//Ìø¹ýÎļþÍ·£¬¶¨Î»µ½Êý¾Ý²¿·Ö
   bool isSize24 = false;
  if (lpbi->biBitCount==32)
  {
   isSize24 = true;
   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;   //¸³Öµ
   }
   //½«Ö¸ÕëÖ¸ÏòеĿؼþ
   
     lpbi->biBitCount = 24;//Ç¿ÐÐÖ¸¶¨
    }
  
  int nColors = 1 << lpbi->biBitCount;   //°´ÕÕÉ趨Éî¶È£¬½øÐÐÑÕÉ«¼ÆËã  
  
  if (nColors > 256)         
   nColors = 0;      
  hdr.bfType = ((WORD)('M' << 8) | 'B'); // Ö¸¶¨BMP

//½øÐÐÎļþÍ·ÉèÖà   
  hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD) + lpbi->biSizeImage;    
  hdr.bfReserved1 = 0;     
  hdr.bfReserved2 = 0;     
  hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + lpbi->biSize + nColors * sizeof(RGBQUAD));  

//½øÐÐλͼдÈë    
  FILE *bmpFile = NULL;     
  bmpFile = fopen((LPCTSTR)szFile, "wb");//szFileΪÎļþÃû     
  if (bmpFile != NULL)     
  {         
   fwrite(&hdr, 1, sizeof(BITMAPFILEHEADER), bmpFile);//λͼÎļþÍ·         
   fwrite(buffer, 1, sizeof(BITMAPINFOHEADER), bmpFile);//λͼÐÅϢͷ

   if (!isSize24)
   {
    fwrite(buffer+sizeof(BITMAPINFOHEADER), 1, nColors * sizeof(RGBQUAD), bmpFile);//ÑÕÉ«±í         
    fwrite(buffer+sizeof(BITMAPINFOHEADER)+nColors * sizeof(RGBQUAD), 1, lpbi->biSizeImage, bmpFile);//λͼÊý¾Ý     
   }
   else
   {
    fwrite(pImg24Temp,1,dwSize24,bmpFile);
   }

  }     
  fclose(bmpFile);      
  CoTaskMemFree(buffer);//ÊÍ·Å×ÊÔ´
  delete pImg24Temp; 
  return hr;
 }
 CATCH (CMemoryException, e)
 {
  
 }
 END_CATCH
 }

 ÕÛÌÚÁËÁ½Ìì£¬Õæ·Ñ¾¢£¬Ìش˼Ǽһϱ¸Íü

Èí¼þ±êÇ©: 24λͼת16λ

°ÑÈí¼þÔËÐÐȷʵµÄ¿â²¹È«ÁË£¬ÐèÒª°Ñ¿âmfco42d.dll¡¢msvcrtd.dll¸´ÖƵ½C:\Windows\System32

ÆäËû°æ±¾ÏÂÔØ

·¢±íÆÀÂÛ

êdzÆ:
±íÇé: ¸ßÐË ¿É º¹ ÎÒ²»Òª º¦Ðß ºÃ ÏÂÏÂÏ ËÍ»¨ ʺ Ç×Ç×