返回> 网站首页
一些技巧(15)
yoours2007-04-20 20:10:20
简介一边听听音乐,一边写写文章。
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();
}
====================================================
模态对话框是一个使用另一个不可以使用.
/*///////////////////
函数 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();
}
====================================================
模态对话框是一个使用另一个不可以使用.
文章评论
1280人参与,0条评论