我现在做视频监控的东西,其中有一个图片预览的程序,图片是存在本地的,我把图片用StretchDIBits()函数贴在了对话框上,现在的问题是我如何在贴这个图之前把字符写到图片上,然后保存下来,求大家指教

解决方案 »

  1.   

    CDC::TextOut
    关于保存图片这里就不赘述了
      

  2.   

    HDC hdc,hdcMem;//设备
    HFONT ftUser;//字体类型句柄
        HBITMAP hBitMap = NULL;//位图要与设备相连必须要转换成此类型
        CBitmap *pBitMap = NULL;//位图
        CDC *pMemDC = NULL; /*HDC定义的变量指向一块内存,这块   
      内存用来描述一个设备的相关的内容,所以也可以   
      认为HDC定义的是一个指针;而CDC类定义一个对象,   
      这个对象拥有HDC定义的一个设备描述表,同时也包   
      含与HDC相关的操作的函数。  */  int fff=m_listDATA.GetItemCount();
    if (fff==0)
    {
    AfxMessageBox("请先导入数据");
    return;
    }
        BYTE *pBits;
    //定义图形大小
    int iWidth = 800;
    int iHeight =(fff+2)*20;
        int iPixel  = 16;
    //图形格式参数
        LPBITMAPINFO lpbmih = new BITMAPINFO;//图形格式参数
        lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        lpbmih->bmiHeader.biWidth = iWidth;//
        lpbmih->bmiHeader.biHeight = iHeight;
        lpbmih->bmiHeader.biPlanes = 1;//目标设备位面数,必须为1
        lpbmih->bmiHeader.biBitCount = iPixel;//颜色深度
        lpbmih->bmiHeader.biCompression = BI_RGB;//位图压缩类型
        lpbmih->bmiHeader.biSizeImage = 0;//大小,字节单位
        lpbmih->bmiHeader.biXPelsPerMeter = 0;//水平分辨率
        lpbmih->bmiHeader.biYPelsPerMeter = 0;//垂直分辨率
        lpbmih->bmiHeader.biClrUsed = 0;//位图实际使用颜色表中颜色数
        lpbmih->bmiHeader.biClrImportant = 0;//位图显示中比较重要的颜色数
        hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);//可以把它的返回值看作   HDC,   但是区别HDC是 你指可以对她进行查询操作。
        hdcMem = CreateCompatibleDC(hdc);//内存dc,
        hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);//创建一个DIB
        pBitMap = new CBitmap;
        pBitMap->Attach(hBitMap);//与位图关联
        pMemDC = new CDC;
        pMemDC->Attach(hdcMem);//与DC内存关联
        pMemDC->SelectObject(pBitMap);//选择内存地址

    pMemDC->SetBkMode(TRANSPARENT);//设置模式
    pMemDC->SetTextColor( RGB(255,255,0));//设置颜色
    ftUser = CreateFont(15,//字体大小
    0,//字间距
    0,//用于指定转义矢量(escapement vector)与显示表面的x轴的夹角(以0.1为单位)
    00,//用于指定字符基线和x轴的夹角(以0.1为单位)。
    FW_BOLD,//字体厚度
    FALSE, // 第6个参数(bItalic)是指定字体是否为斜体的布尔值
    FALSE,//第7个参数(bUnderline)是指定字体是否带有下划线的布尔值
    FALSE,//第8个参数(cStrickout)是指定字符是否带有删除线的布尔值
    GB2312_CHARSET,//指定字体的字体集
    OUT_DEFAULT_PRECIS,//用于指定所需的输出精确度
    CLIP_DEFAULT_PRECIS,//剪辑精确度
    DEFAULT_QUALITY,//字体的输入质量
    DEFAULT_PITCH|FF_MODERN,//字符间距和字符
    "宋体"//字体的字样名称
    );
    (HFONT) SelectObject(hdcMem, ftUser);//选择样式 //向图片中添加文字
    CRect rc;//客户区
    rc.right=iWidth;
    rc.bottom=iHeight;
    rc.top=0;
    CString s;//存放一行数据

    //从列表中取出数据然后添加到图片中
    for(int j=0;j<fff;j++)
    {
    rc.left=0;
    rc.top+=20;
    for(int i=0;i<6;i++)//插入列
    {

    s=m_listDATA.GetItemText(j,i);//取得文字
    if(i!=3)//添加文字位置
    {
    rc.left+=80;
    }
    else
    {
    rc.left+=300;
    }
    pMemDC->DrawText( s, &rc, DT_SINGLELINE|DT_LEFT );//添加文本
    }
    } pMemDC->SelectObject(pBitMap);
        //保存到文件并创建位图结构
        BITMAPFILEHEADER bmfh;
        *((char *)&bmfh.bfType) = 'B';
        *(((char *)&bmfh.bfType) + 1) = 'M';//表明是BMP文件
        bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//偏移位置
        bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;//文件大小
        //TCHAR szBMPFileName[128];//文件名字
        int iBMPBytes = iWidth * iHeight * iPixel / 8;//数据文件大小
        CFile file;
        if(file.Open(m_ClientPathPic,CFile::modeWrite | CFile::modeCreate))
        {
            file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
            file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
            file.Write(pBits,iBMPBytes);
            file.Close();
        }
    else
    {
    AfxMessageBox("无法生成,请确认下载路径是否正确");
    return ;
    }

    //清除内存
        pMemDC->DeleteDC();
        delete pMemDC; pMemDC  = NULL;
        delete pBitMap; pBitMap = NULL;
        delete lpbmih;  lpbmih  = NULL;
    这个是将TXT文件内容写在图片上