一些技巧(15)

来源:互联网 发布:mac如何下载炉石传说 编辑:程序博客网 时间:2024/05/29 07:11
typedef HRESULT (*DLLREGPROC)(void);
/*///////////////////
    函数 RegisterDll()
主要功能: 注册COM
  返回值: 
参数含义: 
  strFileName - 文件名
  注:此函数只对用VB开发的COM有效,对用VC开发的COM无效
////////////////////*/
BOOL RegisterDll(CString strFileName)
{
 DLLREGPROC pProc = NULL;
 HINSTANCE hModule = LoadLibrary(strFileName);
 if (hModule == NULL)
  return FALSE;
 pProc = (DLLREGPROC)GetProcAddress(hModule,"DllRegisterServer");
 
 if (pProc == NULL)
 {
  FreeLibrary(hModule);
  return FALSE;
 }
 
 (*pProc)();
 FreeLibrary(hModule);
 return TRUE;
}
==================================
24位转化为256色灰度
1.格式介绍
24位图,结构为:头信息、RGB数据
256位图,结构为:头信息、调色板、RGB数据索引
2.真彩图转256 色图算法的源程序
//入口参数说明
//m_hData---24位真彩色图的RGB数据首地址
//m_hLength---24位真彩色图的RGB数据的长度

void Trueto256(void*m_hData,long m_hLength)
{
  //请创建自己的目录或获取当前目录:
 CFile file("F://abc.bmp", CFile::modeCreate|CFile::modeReadWrite | CFile::shareExclusive);
//====位图文件头结构和位图信息结构===
 BITMAPFILEHEADER bmFileHeader;
 BITMAPINFOHEADER bmInfo;
 DWORD dwOffSize,dwFileSize;
 dwOffSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//文件头,位图信息头
 dwFileSize = dwOffSize+lpbi->bmiHeader.biHeight*lpbi->bmiHeader.biWidth*sizeof(BYTE)*4;
 
 //计算位图信息到位图数据间的偏移量(字节)
 DWORD dwOffBits = sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+ 256 * sizeof(RGBQUAD);
 //填充BITMAPFILEHEADER结构
 bmFileHeader.bfType=0x4d42;//"BM"
 bmFileHeader.bfSize = dwFileSize;
 bmFileHeader.bfReserved1 = 0;
 bmFileHeader.bfReserved2 = 0;
    bmFileHeader.bfOffBits = dwOffBits;
 //填充BITMAPINFOHEADER结构
 bmInfo.biSize = sizeof(BITMAPINFOHEADER);
 bmInfo.biWidth = lpbi->bmiHeader.biWidth;//位图的宽和高,根据实际情况修改
 bmInfo.biHeight = lpbi->bmiHeader.biHeight;//
 bmInfo.biPlanes = 1;
 bmInfo.biBitCount = 8;
 bmInfo.biCompression = 0;
 bmInfo.biSizeImage = 0;
 bmInfo.biXPelsPerMeter = 0;
 bmInfo.biYPelsPerMeter = 0;
 bmInfo.biClrUsed = 0;
 bmInfo.biClrImportant = 0; 
 //写入文件头和位图信息
 file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER));
 file.Write((LPSTR)&bmInfo, sizeof(BITMAPINFOHEADER));
//====制作调色数据==================================
 RGBQUAD* pRGBQuad = new RGBQUAD[256];
 //初始化为0
 memset(pRGBQuad, 0, 256 * sizeof(RGBQUAD));
 for(int j = 0;j < 256;j++)//这样写是制作成256级灰度的图片
 {
  pRGBQuad[j].rgbRed =j;
  pRGBQuad[j].rgbGreen =j;
  pRGBQuad[j].rgbBlue =j;
 }
 
 //写入调色板数据
 file.Write((LPSTR)pRGBQuad, 256 * sizeof(RGBQUAD));
//循环取出所有像素================================
 byte*temp2;
 temp2=(byte*)malloc(m_hLength/3*sizeof(byte));
 int i;
  byte R,G,B;
  BYTE*m_TempData=(BYTE*)m_hData;
  for(i=0,j=0;i<m_hLength;i+=3,j++)
  {
   B=*(byte*)(m_TempData+i);
   G=*(byte*)(m_TempData+i+1);
   R=*(byte*)(m_TempData+i+2);
   *(temp2+j)=(R*30+B*59+G*11)/100;//真彩色到256色转换的公式
    }
 
  file.Write((LPSTR)temp2,m_hLength/3);//写入BMP数据
  file.Close();
}
//256色数据大小比24位可以减少大约1/3

3.真彩色图的头信息的编写及显示
//真彩色保存BMP函数
//入口参数
//m_hFileName---文件名
//m_hData---RGB数据首地址
//m_Length---RGB数据长度
void SavePicture(CString m_hFileName,BYTE*m_hData,long m_Length)
{
 #define DIB_HEADER_MARKER   ((WORD) ('M' << 8) | 'B')
 int cy,cx;
// cy=lpbi->bmiHeader.biWidth;
 //cx=lpbi->bmiHeader.biHeight;
 // Bitmap文件头
 BITMAPFILEHEADER bmfHdr;
 // 文件类型"BM"
 bmfHdr.bfType = DIB_HEADER_MARKER;
 //
 DWORD dwOffSize,dwFileSize;
 dwOffSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//文件头,位图信息头
 dwFileSize = dwOffSize+cx*cy*sizeof(BYTE)*4;
 //指定文件大小
 bmfHdr.bfSize = dwFileSize;
 // 两个保留字
 bmfHdr.bfReserved1 = 0;
 bmfHdr.bfReserved2 = 0;
 bmfHdr.bfOffBits = dwOffSize;
 BITMAPI
NFOHEADER BIHdr;
 BIHdr.biSize = sizeof(BITMAPINFOHEADER);
 BIHdr.biWidth = cy;////宽度
 BIHdr.biHeight = cx;///高度
 BIHdr.biPlanes = 1;
 BIHdr.biBitCount = 32;
 BIHdr.biCompression = BI_RGB;
 BIHdr.biSizeImage = 0;
 BIHdr.biXPelsPerMeter = 0;
 BIHdr.biYPelsPerMeter = 0;
 BIHdr.biClrUsed = 0;
 BIHdr.biClrImportant = 0;
 CFile file;
 CFileException fe;
 file.Open(m_hFileName.GetBuffer(),CFile::modeCreate | CFile::modeWrite |CFile::shareExclusive,&fe);
 file.Write(&bmfHdr,sizeof(BITMAPFILEHEADER));
 file.Write(&lpbi->bmiHeader,sizeof(BITMAPINFOHEADER));
 file.Write(m_hData,m_Length);
 file.Close();
}

====================================================
模态对话框是一个使用另一个不可以使用.
原创粉丝点击