上篇几个函数

转载 2015年07月09日 15:29:46

声明:以下函数均不为自己所写,所以仅供观看,不过确实能用,而且没有错误

转换函数是本人原创,里面调用了这里的函数

 

//return value:
// 0 OK
// 1 failed
BOOL CDib::OpenFile(const CString &szFileName)
{
 CFile f;
 if (!f.Open(szFileName,CFile::modeRead))
 {
#ifdef _DEBUG
  AfxMessageBox("Can't open file:/n"+szFileName,MB_OK);
#endif 
  return 1;
 }

 //读入位图信息
 void *hbi=ReadBitmapHead(&f);
 if (!hbi)
     return 1;

 //读入位图数据
    BITMAPINFOHEADER *lpbi=(BITMAPINFOHEADER *)hbi;
 int dwsize=lpbi->biSizeImage;
    int dwlen=lpbi->biSize+PaletteSize(*lpbi)+lpbi->biSizeImage;
 void *h=realloc(hbi,dwlen);
 if (!h)
 {
    free(hbi);
    return 1;
 }
 hbi=h;
 lpbi=(BITMAPINFOHEADER *)hbi;
// dwsize=lpbi->biSizeImage;
//    dwlen=lpbi->biSize+PaletteSize(*lpbi)+lpbi->biSizeImage;
UINT temp = PaletteSize(*lpbi);
 f.Read((void *)((BYTE*)lpbi+lpbi->biSize+temp),dwsize);

 hdib=hbi;
    hbm=BitmapFromDib((void *)hdib);
 if (!hbm)
 {
  free(hdib);
  hdib=NULL;
  return 1;
 }

 strFileName = szFileName;
 return 0;
}


HBITMAP CDib::BitmapFromDib (void *dib)
{
  LPBITMAPINFOHEADER  lpbi;
  HDC                 hdc;
  HBITMAP             hbm;


  if(!hdib)
     return(NULL);

  lpbi = (LPBITMAPINFOHEADER)hdib;

  WORD  wPaletteSize;
  hdc = GetDC(NULL);
  wPaletteSize = PaletteSize(*lpbi);
  hbm = CreateDIBitmap(hdc,
                        (LPBITMAPINFOHEADER)lpbi,
                        (DWORD)CBM_INIT,
                        (BYTE*)lpbi + lpbi->biSize + wPaletteSize,
                        (LPBITMAPINFO)lpbi,
                         DIB_RGB_COLORS );
  if (!hbm)  // Couldn't CreateDIBitmap
  {
     AfxMessageBox("Can't create bitmap,Function BitmapFromDib failed");
     return(NULL);
  }
  ReleaseDC(NULL,hdc);

  return(hbm);
}


void *CDib::ReadBitmapHead(CFile *f)
{
 //文件头
 BITMAPFILEHEADER bf;
 f->Read(&bf,sizeof(BITMAPFILEHEADER));
    if (!IsDIB(bf.bfType))
 {
  AfxMessageBox("File type is not Bitmap, Please select Bitmap",MB_OK);
  return(NULL);
 }

 //信息头
 BITMAPINFOHEADER bi;
 f->Read(&bi,sizeof(BITMAPINFOHEADER));
 int size=bi.biSize;
//    switch(size)
// {
// case sizeof(BITMAPINFOHEADER):
//  break;
// case sizeof(BITMAPV4HEADER):
//  break;
//    case sizeof(BITMAPCOREHEADER):
//        BITMAPCOREHEADER *bc=(BITMAPCOREHEADER *)&bi;
//        bi.biSize=40;
//  bi.biWidth=bc->bcWidth;
//  bi.biHeight=bc->bcHeight;
//        bi.biBitCount=bc->bcBitCount;
//  bi.biPlanes=bc->bcPlanes;
//  bi.biClrUsed=0;
//  bi.biClrImportant=0;
//        bi.biCompression=0;
//  f->Seek(sizeof(BITMAPCOREHEADER)-sizeof(BITMAPINFOHEADER),CFile::current);
//  break;
// }

 //位图数据的字节数,计算图像每行象素所占的字节数目,设置成4的整数倍
    bi.biSizeImage=WIDTHBYTES(bi.biWidth*bi.biBitCount)*bi.biHeight;

 //颜色数,对于16、24、32位位图,颜色数为0
 int nnumcolors=DibNumColors(bi);
 if (bi.biClrUsed==0)
    bi.biClrUsed=nnumcolors;

 //位图信息=信息头的大小+调色板的大小
 void *hbi=malloc( size+ PaletteSize(bi) ); 
    if (!hbi)
 {
  AfxMessageBox("Can't allocate memory",MB_OK);
  return(NULL);
 }

 //信息头
    LPBITMAPINFOHEADER lpbi=(BITMAPINFOHEADER *)hbi;
 *lpbi=bi;

 //调色板或颜色掩码
 RGBQUAD *pRgb=(RGBQUAD*)malloc(256*sizeof(RGBQUAD));
 pRgb=(RGBQUAD *)((BYTE*)lpbi+sizeof(BITMAPINFOHEADER));
//    if  (size==sizeof(BITMAPV4HEADER))
// {
//  f->Seek(sizeof(BITMAPV4HEADER)-sizeof(BITMAPINFOHEADER),CFile::current);
//        pRgb=(RGBQUAD *)((BYTE*)pRgb+sizeof(BITMAPV4HEADER)-sizeof(BITMAPINFOHEADER));
//    }
// else 
 if (bi.biCompression==BI_BITFIELDS && bi.biBitCount>8)
 {
       f->Read( pRgb,3*sizeof(DWORD));
    pRgb=(RGBQUAD *)((BYTE*)pRgb+3*sizeof(DWORD));
 }

    if (nnumcolors)//读取调色板信息
 {
//  if (size==sizeof(BITMAPCOREHEADER))
//  {
//            f->Read((void *)((BYTE*)pRgb),nnumcolors*sizeof(RGBTRIPLE));
//    RGBQUAD rgb;
//           for(int i=nnumcolors-1;i >= 0;i--)
//   {
//    rgb.rgbRed=((RGBTRIPLE *)pRgb)[i].rgbtRed;
//    rgb.rgbGreen=((RGBTRIPLE *)pRgb)[i].rgbtGreen;
//    rgb.rgbBlue=((RGBTRIPLE *)pRgb)[i].rgbtBlue;
//                rgb.rgbReserved=(BYTE)0;
//    pRgb[i]=rgb;
//   }
//  }
//  else
  {
   f->Read((void *)((BYTE*)pRgb),nnumcolors*sizeof(RGBQUAD));
  }
 }
 
 strFileName = f->GetFilePath();
    return(hbi);
}


UINT  CDib::DibNumColors(void *dib)
{
 BITMAPINFOHEADER *lpbi = (BITMAPINFOHEADER *)dib;
 switch (lpbi->biBitCount)
 {
 case 1:
  return(2);
 case 4:
  return(16);
 case 8:
  return(256);
    default:
  return(lpbi->biClrUsed);
 }
}

UINT CDib::DibNumColors(BITMAPINFOHEADER bi)
{
 switch (bi.biBitCount)
 {
 case 1:
  return(2);
 case 4:
  return(16);
 case 8:
  return(256);
    default:
  return(bi.biClrUsed);
 }

}

int CDib::BitsPerPixel()
{
 return ((BITMAPINFOHEADER*)hdib)->biBitCount;
}

UINT CDib::BitsPerPixel(BITMAPINFOHEADER bi)
{
 return bi.biBitCount;
}

UINT CDib::BitsPerPixel(void *dib)
{
 BITMAPINFOHEADER *lpbi = (BITMAPINFOHEADER *)dib;
 return lpbi->biBitCount;
}

//调色板数据或颜色掩码占用空间大小
//biBitCount=16、32时,
// 当 biCompression成员的值是BI_RGB,它没有调色板。
// 如果biCompression成员的值是BI_BITFIELDS,原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。
UINT CDib::PaletteSize()
{
    if (hdib)
 {
       BITMAPINFOHEADER *lpbi=(BITMAPINFOHEADER *)hdib;
    if (lpbi->biSize==sizeof(BITMAPINFOHEADER)&&
             (lpbi->biBitCount>8)&&(lpbi->biCompression==BI_BITFIELDS))
    {
     return(3*sizeof(DWORD));
    }
    else
    {
     return(DibNumColors(*lpbi)*sizeof(RGBQUAD));
    }
 }
 else
 {
  return(-1);
 }

}

//调色板数据或颜色掩码占用空间大小
//biBitCount=16、32时,
// 当 biCompression成员的值是BI_RGB,它没有调色板。
// 如果biCompression成员的值是BI_BITFIELDS,原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。
UINT CDib::PaletteSize(BITMAPINFOHEADER bi)
{

 if (bi.biSize==sizeof(BITMAPINFOHEADER)&&
             (bi.biBitCount>8)&&(bi.biCompression==BI_BITFIELDS))
    {
    return(3*sizeof(DWORD));
    }
    else
    {
    return(DibNumColors(bi)*sizeof(RGBQUAD));
    }

}

BITMAPINFOHEADER CDib::GetBitmapInfo()
{
 BITMAPINFOHEADER bi;

 memcpy((void *)&bi,(void *)hdib,sizeof(BITMAPINFOHEADER));

 return(bi);
}

BOOL CDib::DrawBitmap(CDC *pDC,int xOffset,int yOffset)
{
     BITMAPINFO *lpbf;
     BITMAPINFOHEADER *lpbi;
  if (hdib)
  {
      lpbf=(BITMAPINFO *)hdib;
   lpbi=(BITMAPINFOHEADER *)hdib;
         ::SetDIBitsToDevice(pDC->m_hDC,
                     xOffset,yOffset,
                  lpbi->biWidth,ABS(int(lpbi->biHeight)),
         0,0,
                           0,ABS(int(lpbi->biHeight)),
                  (void *)((BYTE*)lpbi+lpbi->biSize+PaletteSize(*lpbi)),
                  lpbf,
                  DIB_RGB_COLORS);

//   CDC memDc;
//      memDc.CreateCompatibleDC(pDC);
//      memDc.SelectObject(hbm);
//      pDC->BitBlt(0,0,lpbi->biWidth,lpbi->biHeight,&memDc,0,0,SRCCOPY);

  }

  return(TRUE);
}

UINT CDib::Width()
{
 if (hdib)
 {
        BITMAPINFOHEADER *lpbi=(BITMAPINFOHEADER *)hdib;
  return lpbi->biWidth;
 }
 else
 {
  return(0);
 }
}

int CDib::Height()
{
    if (hdib)
 {
        BITMAPINFOHEADER *lpbi=(BITMAPINFOHEADER *)hdib;
  return lpbi->biHeight;
 }
 else
 {
  return(0);
 }
}

void *CDib::GetBits()
{
    if (hdib)
 {
  return((void *)((BYTE*)hdib+sizeof(BITMAPINFOHEADER)));
 }
 else
 {
  return(NULL);
 }
}

BOOL CDib::SaveFile(LPCSTR szFileName)
{
    CFile f;

 if(!f.Open(szFileName,CFile::modeCreate|CFile::shareDenyWrite|CFile::modeWrite))
 {
  AfxMessageBox("无法打开文件");
  return(FALSE);
 }

    BITMAPFILEHEADER bf;
    bf.bfType=0x4d42;
 bf.bfSize=sizeof(BITMAPFILEHEADER)+_msize(hdib);
    bf.bfReserved1=0;
 bf.bfReserved2=0;
 bf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+PaletteSize();

    f.Write((void *)&bf,sizeof(BITMAPFILEHEADER));
 f.Write(hdib,_msize(hdib));

 f.Close();

 strFileName = szFileName;
 return(TRUE);
}

CDib& CDib::operator=(CDib &dib)
{
 int size;

 FreeDib();
 size=_msize(dib.hdib);
 hdib=malloc(size);
 memcpy(hdib,dib.hdib,size);

 hbm=BitmapFromDib(hdib);

 return(*this);
}

BOOL CDib::SetBitmapinfoAndBits(BITMAPINFOHEADER bi, void *bits)
{
    int size;
 void *newdib;
 BITMAPINFOHEADER *lpbi;

 size=_msize(bits);
    newdib=malloc(sizeof(BITMAPINFOHEADER)+size);
    if (!newdib)
 {
  AfxMessageBox("can't allocate memory");
  return(FALSE);
 }
 FreeDib();
 hdib=newdib;

 lpbi=(BITMAPINFOHEADER *)newdib;
 *lpbi=bi;

 newdib=(void *)((BYTE*)newdib+sizeof(BITMAPINFOHEADER));
 memcpy(newdib,bits,size);

    if (!BitmapFromDib(hdib))
 {
  AfxMessageBox("can't create a new bitmap");
  return(FALSE);
 }
 return(TRUE);

}

 

 


void CDib::FreeDib()
{
    if (hdib)
 {
  free(hdib);
  hdib = NULL;
 }
 if (hbm)
  DeleteObject(hbm);
}

几何画板中几种作函数图像的方法

随着社会的发展,现代教学很多的地方都有了多媒体教学,这就需要一些教学软件的辅助了,几何画板就是其中之一。一些老师在使用几何画板的过程中,常常涉及到函数图象的绘制。因此,很多用户对这方面教程是非常的感兴...
  • forererer
  • forererer
  • 2016年06月12日 13:26
  • 4023

如何计算两个文档的相似度(二)

注:完全进行了测试,并附有完整代码: # -*- coding: cp936 -*- from gensim import corpora, models, similarities import...
  • qq_27231343
  • qq_27231343
  • 2016年07月17日 17:30
  • 2714

mysql实现文章上一篇下一篇的sql语句

转载:http://www.111cn.net/database/mysql/66709.htm 在mysql中查查询上一篇与下一篇只需要对数据进行按id排序之后,然后我们再进行asc或者d...
  • awawfwfw
  • awawfwfw
  • 2015年07月26日 00:46
  • 2633

【Linux学习笔记】栈与函数调用惯例—上篇

栈与函数调用惯例(又称调用约定)— 基础篇         记得一年半前参加百度的校招面试时,被问到函数调用惯例的问题。当时只是懂个大概,比如常见函数调用约定类型及对应的参数入栈顺序等。最近看书过程...
  • slvher
  • slvher
  • 2013年04月21日 20:40
  • 1816

跟我学习php数组常用函数-上篇

对于php的初学者,也许会对它大量的函数不清楚该学习哪些。我在这列举了一些大家实际当中可能会使用到的,供您参考 1) array_map ( callable callback,arraycall...
  • sinat_32124195
  • sinat_32124195
  • 2016年06月05日 13:16
  • 206

对于C++11中lambda函数的一点理解(上篇)

作为一个C++程序员,在日常的编程中,我们时不时会到这样的窘境:在一个方法里,某些代码逻辑会出现这不同的地方,假如要单独为它们写个方法嘛会显得有点琐碎,不写嘛同样的代码又会出现在多个地方,违反了程序员...
  • Raymond_Lu
  • Raymond_Lu
  • 2016年10月30日 22:19
  • 137

系统调用Open()函数的内核追踪(上篇)

From: http://blog.chinaunix.net/uid-24585858-id-2125500.html open函数相信大家都用过,这里就不多说它的使用方法等事项,现直接进入正...
  • fyfcauc
  • fyfcauc
  • 2014年07月14日 11:26
  • 339

跟我学习php文件和目录常用函数-上篇

获得更好阅读效果 1> bool file_exists(string$filename) 检查文件或目录是否存在 2> int filesize(string$filename) 取得指定...
  • sinat_32124195
  • sinat_32124195
  • 2016年06月11日 21:12
  • 268

跟我学习php字符串常用函数-上篇

获得更好阅读效果 1> string trim ( string str[,stringstr [, string charlist = ” \t\n\r\0\x0B” ] ) 去除首尾的空白字...
  • sinat_32124195
  • sinat_32124195
  • 2016年06月09日 14:45
  • 216

玩转WISH中级教程之WISH规则详解抢先版上篇

  • 2014年12月20日 09:27
  • 1.86MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:上篇几个函数
举报原因:
原因补充:

(最多只允许输入30个字)