8位位圖轉換成24位位圖

8位位圖與24位位圖的區別就在於8位的有調色板,而24位的沒有。調色板信息是按(BGRA)順序存放的,每4位是一個調色板項,共有256個調色板,故只能顯示256種顏色,其中A始終爲0。位圖數據區則是存儲的調色板索引,比如0,1,2……按索引獲取顏色。

24位的則不然,24位位圖沒有調色板,數據區存儲的就是BGR顏色數據,每3位爲一個像素點的顏色,所以可以顯示2的24次方種顏色。

轉換過程很容易,就是按照8位位圖索引取出調色板中的數據,把A捨去,把其他的按順序存儲到24位圖像的數據區,在數據區前加上位圖的頭就OK了,代碼如下:

void CDib::ConverTo24Bit()
{
 LPBITMAPINFOHEADER  lpbi;
 if(!hdib)
  return;
 lpbi = (BITMAPINFOHEADER*)hdib;//hdib是成員變量,指向已打開的位圖信息首地址
 int height = lpbi->biHeight;
 //兩個寬度
 LONG lLineBytes24=((lpbi->biWidth*24+31)/32*4);
 LONG lLineBytes8=((lpbi->biWidth*8+31)/32*4);
 //源圖像的指針,申請一塊足夠大的內存
 BYTE* srcBits ;//= (BYTE*)malloc(lLineBytes8*height);
 //使其指向源圖像的圖像數據起始地址
 srcBits = (BYTE*)lpbi+sizeof(BITMAPINFOHEADER)+PaletteSize();
 //轉換後的圖像數據指針
 BYTE* dstBits = (BYTE*)malloc(lLineBytes24*height);
 //調色板信息
 RGBQUAD *pRgb = (RGBQUAD *)((BYTE*)lpbi+sizeof(BITMAPINFOHEADER));
 //通過循環,使8位BMP中的顏色信息轉換爲24位
 //因爲24位是用三位表示一個顏色(順序是BGR),沒有調色板,而8位的是一位表示一個顏色信息在調色板中的偏移量
 for( int i=0; i<height; i++)
 {
  for(int j=0, n=0; j<lLineBytes8; j++)
  {
   int num = *(srcBits+lLineBytes8*i+j);//獲取8位中調色板信息的偏移量
   //將顏色信息寫入24位指針指向的地址(爲了保證dstBits始終指向首地址,故不寫成dst=...)
   *(dstBits+lLineBytes24*i+n)=pRgb[num].rgbBlue;
   n++;
   *(dstBits+lLineBytes24*i+n)=pRgb[num].rgbGreen;
   n++;
   *(dstBits+lLineBytes24*i+n)=pRgb[num].rgbRed;
   n++;
  }
 }
 //24位BMP的信息頭
 BITMAPINFOHEADER bi;
 bi.biBitCount=24;
 bi.biClrImportant=0;
 bi.biClrUsed=0;
 bi.biCompression=0L;
 bi.biHeight=Height();
 bi.biPlanes=1;
 bi.biSize=sizeof(BITMAPINFOHEADER);
 bi.biSizeImage=Height()*lLineBytes24;
 bi.biWidth=Width();
 bi.biXPelsPerMeter=0;
 bi.biYPelsPerMeter=0;
 //設置BMP信息頭和數據信息函數
 SetBitmapinfoAndBits(bi, dstBits);//函數功能爲把信息頭和數據信息合併,存儲在hdib指針指向的區域內
 CString FileName;
 strFileName.Delete(strFileName.GetLength()-4, 4);
 FileName.Format("%s的24位圖.bmp",strFileName);
 SaveFile(FileName);//把hdib指向的區域寫入到文件
 //收尾清除指針內存
 //free(srcBits);
 srcBits = NULL;
 free(dstBits);
 dstBits = NULL;
 AfxMessageBox("已經轉換成24位,另存爲:"+FileName);
}

 

關於讀取和設置信息頭,保存部分會寫在別的地方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章