请问如何在BMP图片上指定位置叠加字符 我现在做视频监控的东西,其中有一个图片预览的程序,图片是存在本地的,我把图片用StretchDIBits()函数贴在了对话框上,现在的问题是我如何在贴这个图之前把字符写到图片上,然后保存下来,求大家指教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CDC::TextOut关于保存图片这里就不赘述了 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文件内容写在图片上 窗口置顶的问题 这种样式要怎么改??????? 如何把 DWORD 变量里的4个字节 分别放到4个char变量里 求救!十分火急,大家快来帮帮忙啊 如何根据一定的条件是树控件定位的特定的项目上? 求救,如何打开一个USB设备,CreateFile吗?请具体些 高分求用C++7.0编写的ISAPI“hello word”程序 请教 矢量字体?? 100送上,紧急请教执行一条语句后半分钟再执行另一条语句怎么实现? vc调用vc的DLL出错?? 旷世难题>破VISTA系统的注册表权限问题 ctreectrl insertitem 插入首元素
关于保存图片这里就不赘述了
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文件内容写在图片上