现在的位置: 首页 > 综合 > 正文

StretchDIBits

2013年12月14日 ⁄ 综合 ⁄ 共 2859字 ⁄ 字号 评论关闭

 

BOOL CDib::Draw(CDC *pDC)
{
 StretchDIBits(pDC->m_hDC,0,0,BitMapInfo.BitMIH.biWidth,BitMapInfo.BitMIH.biHeight,0,0,BitMapInfo.BitMIH.biWidth,BitMapInfo.BitMIH.biHeight,pDataDib,(BITMAPINFO *)&BitMapInfo,BI_RGB,SRCCOPY);
 return(TRUE);
}

BOOL CDib::SetPalette(CDC *pDC) //参照《VC++6.0》
{
 CPalette *pOldPalette;
 pOldPalette=pDC->SelectPalette(&m_Palette,FALSE);
 pDC->RealizePalette();
 pDC->SelectPalette(pOldPalette,FALSE);
 return(TRUE);
}

void CDib::ImageHeaderMake(short nCols, short nRows, unsigned long nFrameSize) //自己独立编写
{
 int nPaletteSize = sizeof(RGBQUAD)*256;
 //BITMAPINFO = BITMAPINFOHEADER + RGBQUAD
 BitMapInfo.BitMIH.biSize=sizeof(BITMAPINFOHEADER);
 BitMapInfo.BitMIH.biWidth=nCols;
 BitMapInfo.BitMIH.biHeight=nRows;
 BitMapInfo.BitMIH.biPlanes=1;
 BitMapInfo.BitMIH.biBitCount=8;
 BitMapInfo.BitMIH.biCompression=0;
 BitMapInfo.BitMIH.biSizeImage=nFrameSize;
 BitMapInfo.BitMIH.biXPelsPerMeter=2835;
 BitMapInfo.BitMIH.biYPelsPerMeter=2835;
 BitMapInfo.BitMIH.biClrUsed=256;
 BitMapInfo.BitMIH.biClrImportant=256;
 for(int i=0; i<256; i++)
 {
  BitMapInfo.RgbQ[i].rgbBlue=i;
  BitMapInfo.RgbQ[i].rgbGreen=i;
  BitMapInfo.RgbQ[i].rgbRed=i;
 }
}

void CDib::MakePalette() //参照《VC++6.0》
{
 m_pPalette=(RGBQUAD *)&BitMapInfo; //读调色板
 int m_nPaletteEntries=256;
 if(m_Palette.GetSafeHandle()!=NULL)
  m_Palette.DeleteObject();
 if(m_nPaletteEntries!=0)
 {
  LOGPALETTE *pLogPal=(LOGPALETTE *)new char[sizeof(LOGPALETTE)
   +m_nPaletteEntries*sizeof(PALETTEENTRY)];
  if(pLogPal!=NULL)
  {
   pLogPal->palVersion=0x300;
   pLogPal->palNumEntries=m_nPaletteEntries;
   for(int i=0;i<m_nPaletteEntries;i++)
   {
    pLogPal->palPalEntry[i].peRed=i;
    pLogPal->palPalEntry[i].peGreen=i;
    pLogPal->palPalEntry[i].peBlue=i;
   }
   m_Palette.CreatePalette(pLogPal);
   delete [] pLogPal;
  }
 }
}

void CDib::ProcessImage(short nCols, short nRows, unsigned long nFrameSize, BYTE *pData)
{
 ImageHeaderMake(nCols,nRows,nFrameSize);
 MakePalette();
 pDataDib=pData;
}

BYTE *CDib::LoadBMP(const char *pszFilename) //参考《VC++6.0》自己编写
{
 CFile cf;
 if(!cf.Open(pszFilename,CFile::modeRead)) //打开失败则返回
 {
  AfxMessageBox("Failed to open file for read.");
  return NULL;
 }
 BYTE *pDib;
 unsigned long nDataLength;
 nDataLength = cf.GetLength()-sizeof(BITMAPFILEHEADER)-sizeof(BitMapInfo);
 pDib = new BYTE [nDataLength];
 BITMAPFILEHEADER BFH;
 if(cf.Read(&BFH,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER) //若文件头长度不相符
  ||BFH.bfType!='MB')                                             //若文件类型不是Bitmap
 {                                                                   //则清空pDib后返回
  delete [] pDib;
  return NULL;
 }
 BITMAPINFOHEADER BIH;
 cf.Read(&BIH,sizeof(BITMAPINFOHEADER));
 if(BIH.biBitCount!=8)
 {
  AfxMessageBox("We can only read 8bit bmp image!");
  return NULL;
 }
 nRows=BIH.biHeight;
 nCols=BIH.biWidth;
 nLength=nDataLength;
 nFrameSize=BIH.biSizeImage;
 cf.Seek(-sizeof(BITMAPINFOHEADER),SEEK_CUR);
 cf.Read(&BitMapInfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
 cf.Read(pDib,nDataLength);
 return pDib;

}

抱歉!评论已关闭.