在这里我要实现的功能是,在一幅图片上加上一些文字,我用的方法是先调入一幅图片,把图片选到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);     //释放图像数据内存
}

解决方案 »

  1.   

    难道是这的缘故:
    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位图资源,因为定义一个这种对象,它占据了内存空间,要及时释放内存 
      

  2.   

    是的,就是这个问题,我还想问个问题,将图像拷贝到内dc中,然后再在dc里面加上文字,最后保存dc位图,在dc中加入文字是不是很耗时间,有没有速度更快的方法
      

  3.   

    你要在DC上加文字,而且是定时的执行,好像没别的办法了吧,只有将DC拷贝到内存,然后再将内存数据保存为文件。
      

  4.   

    关于效率问题,也给不了你什么建议,把一些只要初始化一次就好了的东西在开始时就做好,不要在这个函数里create后又delete。比如你的字体,如果全都是一种字体,你就可以在外面初始化好,函数里直接使用。还有
    HDC hDC = GetDC(cdlg->m_hWnd); 
    HDC hMemDC = CreateCompatibleDC(hDC); 
    上面两个DC也可以在程序开始时就做好,在退出程序时再release。