在这里我要实现的功能是,在一幅图片上加上一些文字,我用的方法是先调入一幅图片,把图片选到dc里面,然后在dc上写字.最后保存dc为位图,由于我是用定时器每隔一定的时间就调一幅图片,下面的红色代码部分是我加的,就是实现在一幅图片上加文字,但是当我运行一定时间后,打开任务管理器看,内存使用率在不断的增加,增加到一定程度,就弹出错误了.可是当我将这部分代码注释掉不执行的话,就不会出现这个情况,即便我一直运行下去,内存使用率几乎不变化.我在下面也释放了啊,不知道是为什么,仍外还想问下,怎么能够改变我加入的字体的大小和字体,请路过大虾帮忙看看,谢谢了,一定给分.下面是我的代码部分:
//多媒体定时器
void PASCAL TimerProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{// int x,y;
char ch[10];
//申明一个读写一副bmp位图对象,并用new初始化
Read_Write_Bmp *R_W;
R_W=new Read_Write_Bmp;
//申明一个截屏的对象,并利用new初始化
JiePing * JP;
JP=new JiePing;
//申明一个MuBiaoShiBie类的对象,并用new初始化
MuBiaoShiBie *object;
object=new MuBiaoShiBie; //利用new 初始化
CDemoDlg *cdlg=(CDemoDlg*)dwUser;
int scanwidth;
scanwidth=(long)(((width*8)+31)>>5)<<2; //图像每行占的字节数
//为图像数据开辟一个“height*widt”大的内存空间
unsigned char *tempimage;
tempimage=(unsigned char*)malloc(sizeof(unsigned char)*height*scanwidth);
char *fielname="result.bmp";
CRect rect;
rect.left = 20; //从屏幕左边第20个像素处开始截取
rect.top = 30; //从屏幕上面第30个像素处开始截取
//截取的图片宽度和高度分别为width和height
rect.right =20+width;//GetSystemMetrics(SM_CXSCREEN)/2+20;
rect.bottom =30+height;//GetSystemMetrics(SM_CYSCREEN)/2+168;
// x=CF.X;
// y=CF.Y; //截取屏幕上指定的区域图像
HBITMAP hMap = JP->CopyScreenToBitmap(rect);
//将所截取的图像数据保存为以fielname命名的bmp位图
JP->SaveBitmapToFile(hMap,fielname,width,height);
//读取以fielname为名字的bmp位图,将图像数据保存到tempimage中
R_W->ReadBmpImage(tempimage,fielname,height,width);
//对tempimage中的图像数据进行邻域信息熵检测和跟踪目标
// obj=object->LocalXinXiShang(tempimage,width,height,obj,tem_l,tem_h);
// obj=object->GradientGenZong(tempimage,width,height,obj);
obj=object->GrayobjectMeanshift(tempimage,width,height,obj,15,10,Qu,tem_l,tem_h);
//将检测和跟踪的结果保存到以fielname的bmp位图中
R_W->WriteBmpImage(tempimage,fielname,height,width);
DeleteObject(hMap);//每个CreateCompatibleBitmap或者LoadImage都需要有一个DeleteObject与其对应。
cdlg->newfile<<obj.object[0]<<" "<<obj.object[1]<<" "<<obj.object[2]<<" "<<obj.object[3]<<endl;
itoa(obj.n,ch,10); //将整型数据进行字符化
cdlg->SetDlgItemText(IDC_ZhenXuShu,ch);
HBITMAP hBitmap;
//在图片上加上字,把图片选到dc里面,然后在dc上写字.最后保存dc为位图
hBitmap=(HBITMAP)LoadImage(NULL,fielname,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //调入名为fielname的bmp位图
HDC hDC = GetDC(cdlg->m_hWnd);
HDC hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitmap);
RECT rect1 = {50, 50, 100, 100};
SetBkMode(hMemDC, TRANSPARENT);
SetTextColor(hMemDC,RGB(255,255,255));//文字颜色
CFont font;
font.CreateFont(12,0,0,0,10,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,_T("隶书"));
CFont *pOldFont = (CFont*)SelectObject(hMemDC,&font);
// TextOut(hMemDC,50,100,"nihao",10);
DrawText(hMemDC, "你好", -1, &rect1,DT_PATH_ELLIPSIS);
//将加好了字的图像保存下来
JP->SaveBitmapToFile(hBitmap,fielname,width,height);
//调图像并显示出来
hBitmap=(HBITMAP)LoadImage(NULL,fielname,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE); cdlg->m_Image.SetBitmap(hBitmap); //将名为fielname的bmp位图显示在对话框上与m_Image关联的Bitmap资源框上 DeleteObject(pOldFont);
font.DeleteObject();
DeleteDC(hMemDC);
DeleteDC(hDC);
DeleteObject(hBitmap); //删除hBitmap位图资源,因为定义一个这种对象,它占据了内存空间,要及时释放内存
free(tempimage); //释放图像数据内存
}
//多媒体定时器
void PASCAL TimerProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{// int x,y;
char ch[10];
//申明一个读写一副bmp位图对象,并用new初始化
Read_Write_Bmp *R_W;
R_W=new Read_Write_Bmp;
//申明一个截屏的对象,并利用new初始化
JiePing * JP;
JP=new JiePing;
//申明一个MuBiaoShiBie类的对象,并用new初始化
MuBiaoShiBie *object;
object=new MuBiaoShiBie; //利用new 初始化
CDemoDlg *cdlg=(CDemoDlg*)dwUser;
int scanwidth;
scanwidth=(long)(((width*8)+31)>>5)<<2; //图像每行占的字节数
//为图像数据开辟一个“height*widt”大的内存空间
unsigned char *tempimage;
tempimage=(unsigned char*)malloc(sizeof(unsigned char)*height*scanwidth);
char *fielname="result.bmp";
CRect rect;
rect.left = 20; //从屏幕左边第20个像素处开始截取
rect.top = 30; //从屏幕上面第30个像素处开始截取
//截取的图片宽度和高度分别为width和height
rect.right =20+width;//GetSystemMetrics(SM_CXSCREEN)/2+20;
rect.bottom =30+height;//GetSystemMetrics(SM_CYSCREEN)/2+168;
// x=CF.X;
// y=CF.Y; //截取屏幕上指定的区域图像
HBITMAP hMap = JP->CopyScreenToBitmap(rect);
//将所截取的图像数据保存为以fielname命名的bmp位图
JP->SaveBitmapToFile(hMap,fielname,width,height);
//读取以fielname为名字的bmp位图,将图像数据保存到tempimage中
R_W->ReadBmpImage(tempimage,fielname,height,width);
//对tempimage中的图像数据进行邻域信息熵检测和跟踪目标
// obj=object->LocalXinXiShang(tempimage,width,height,obj,tem_l,tem_h);
// obj=object->GradientGenZong(tempimage,width,height,obj);
obj=object->GrayobjectMeanshift(tempimage,width,height,obj,15,10,Qu,tem_l,tem_h);
//将检测和跟踪的结果保存到以fielname的bmp位图中
R_W->WriteBmpImage(tempimage,fielname,height,width);
DeleteObject(hMap);//每个CreateCompatibleBitmap或者LoadImage都需要有一个DeleteObject与其对应。
cdlg->newfile<<obj.object[0]<<" "<<obj.object[1]<<" "<<obj.object[2]<<" "<<obj.object[3]<<endl;
itoa(obj.n,ch,10); //将整型数据进行字符化
cdlg->SetDlgItemText(IDC_ZhenXuShu,ch);
HBITMAP hBitmap;
//在图片上加上字,把图片选到dc里面,然后在dc上写字.最后保存dc为位图
hBitmap=(HBITMAP)LoadImage(NULL,fielname,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //调入名为fielname的bmp位图
HDC hDC = GetDC(cdlg->m_hWnd);
HDC hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitmap);
RECT rect1 = {50, 50, 100, 100};
SetBkMode(hMemDC, TRANSPARENT);
SetTextColor(hMemDC,RGB(255,255,255));//文字颜色
CFont font;
font.CreateFont(12,0,0,0,10,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,_T("隶书"));
CFont *pOldFont = (CFont*)SelectObject(hMemDC,&font);
// TextOut(hMemDC,50,100,"nihao",10);
DrawText(hMemDC, "你好", -1, &rect1,DT_PATH_ELLIPSIS);
//将加好了字的图像保存下来
JP->SaveBitmapToFile(hBitmap,fielname,width,height);
//调图像并显示出来
hBitmap=(HBITMAP)LoadImage(NULL,fielname,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE); cdlg->m_Image.SetBitmap(hBitmap); //将名为fielname的bmp位图显示在对话框上与m_Image关联的Bitmap资源框上 DeleteObject(pOldFont);
font.DeleteObject();
DeleteDC(hMemDC);
DeleteDC(hDC);
DeleteObject(hBitmap); //删除hBitmap位图资源,因为定义一个这种对象,它占据了内存空间,要及时释放内存
free(tempimage); //释放图像数据内存
}
解决方案 »
- CFtpFind 为何不能搜寻Ftp服务器上深度大于等于2的目录?
- 哪个uml工具对vc的逆向工程比较好?
- 两个类在之间如何传递数据?
- 请问一个在VC内嵌汇编的问题?
- 请问哪位星星做过“wia”的东东?window image aqu。。。
- 求版本自动更新程序,谁知道哪里有免费下载的代码?
- new和delete的问题
- 这是怎么回事?不用高手就可以告诉我的。
- 工具栏中的按钮我不想自己画,而是想用.ico做按钮背景,可是怎么控制ico大小啊,
- 急!!!请问在英文WINNT4下用什么软件可以实现屏幕翻译?可以加分。
- 跪求 一音频快慢放程序(从速完成,学生价格只要很简单,不然毕不了业了)
- 对话框数据传递问题
HBITMAP hBitmap;
这里你LoadImage()一次了
//在图片上加上字,把图片选到dc里面,然后在dc上写字.最后保存dc为位图
hBitmap=(HBITMAP)LoadImage(NULL,fielname, IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //调入名为fielname的bmp位图 你又LoadImage()一次
hBitmap=(HBITMAP)LoadImage(NULL,fielname, IMAGE_BITMAP,0,0,LR_LOADFROMFILE); cdlg->m_Image.SetBitmap(hBitmap); //将名为fielname的bmp位图显示在对话框上与m_Image关联的Bitmap资源框上 最后你只delete了一次
DeleteObject(hBitmap); //删除hBitmap位图资源,因为定义一个这种对象,它占据了内存空间,要及时释放内存
HDC hDC = GetDC(cdlg->m_hWnd);
HDC hMemDC = CreateCompatibleDC(hDC);
上面两个DC也可以在程序开始时就做好,在退出程序时再release。