一些技巧(15)

前端之家收集整理的这篇文章主要介绍了一些技巧(15)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
typedefHRESULT(*DLLREGPROC)(void); /*/////////////////// 函数RegisterDll() 主要功能:注册COM 返回值: 参数含义: strFileName-文件名 注:此函数只对用VB开发的COM有效,对用VC开发的COM无效 ////////////////////*/ BOOLRegisterDll(CStringstrFileName) { DLLREGPROCpProc=NULL; HINSTANCEhModule=LoadLibrary(strFileName); if(hModule==NULL) returnFALSE; pProc=(DLLREGPROC)GetProcAddress(hModule,"DllRegisterServer"); if(pProc==NULL) { FreeLibrary(hModule); returnFALSE; } (*pProc)(); FreeLibrary(hModule); returnTRUE; } ================================== 24位转化为256色灰度 1.格式介绍 24位图,结构为:头信息、RGB数据 256位图,结构为:头信息、调色板、RGB数据索引 2.真彩图转256色图算法的源程序 //入口参数说明 //m_hData---24位真彩色图的RGB数据首地址 //m_hLength---24位真彩色图的RGB数据的长度 voidTrueto256(void*m_hData,longm_hLength) { //请创建自己的目录或获取当前目录: CFilefile("F://abc.bmp",CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive); //====位图文件头结构和位图信息结构=== BITMAPFILEHEADERbmFileHeader; BITMAPINFOHEADERbmInfo; DWORDdwOffSize,dwFileSize; dwOffSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//文件头,位图信息头 dwFileSize=dwOffSize+lpbi->bmiHeader.biHeight*lpbi->bmiHeader.biWidth*sizeof(BYTE)*4; //计算位图信息到位图数据间的偏移量(字节) DWORDdwOffBits=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=newRGBQUAD[256]; //初始化为0 memset(pRGBQuad,256*sizeof(RGBQUAD)); for(intj=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)); inti; byteR,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数据长度 voidSavePicture(CStringm_hFileName,BYTE*m_hData,longm_Length) { #defineDIB_HEADER_MARKER((WORD)('M'<<8)|'B') intcy,cx; //cy=lpbi->bmiHeader.biWidth; //cx=lpbi->bmiHeader.biHeight; //Bitmap文件头 BITMAPFILEHEADERbmfHdr; //文件类型"BM" bmfHdr.bfType=DIB_HEADER_MARKER; // DWORDdwOffSize,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 NFOHEADERBIHdr; 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; CFilefile; CFileExceptionfe; 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(); } ==================================================== 模态对话框是一个使用另一个不可以使用. 原文链接:https://www.f2er.com/vb/261553.html

猜你在找的VB相关文章