求助!!JPG叠加字符的问题

absxiang 2010-05-24 02:58:31
我想把硬盘下的JPG文件叠加上字符后再保存回去,网上查了下,一般都是说把JPG转成BMP,叠加完之后再转回JPG,我用了如下代码:bWorking=finder.FindNextFile();
strFileTitle=finder.GetFileTitle();
strpath=finder.GetFilePath();
CImage imgTransfer;
imgTransfer.Load(strpath);
strpath.Format( _T( "C:\\%s.bmp" ), strFileTitle);
imgTransfer.Save(strpath);
//////////////////////转成BMP
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strpath,0,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(hBitmap);
MemDC.TextOutW(1,1,strFileTitle);

WORD wbitsCount;
DWORD dwpalettelsize=0;
DWORD dwbmdibitsize,dwdibsize,dwwritten;
BITMAP bitmap;
BITMAPFILEHEADER bmfhdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);
wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bitmap.bmWidth;
bi.biHeight=bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= bitmap.bmBitsPixel ;
bi.biClrImportant=0;
bi.biClrUsed=0;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biYPelsPerMeter=0;
bi.biXPelsPerMeter=0;
if(wbitsCount<=8)dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
*lpbi=bi;//将bi中的数据写入分配的内存中。
HDC hdc=::GetDC(NULL);
GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
fh=CreateFile(strpath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh==INVALID_HANDLE_VALUE)
bmfhdr.bfType=0x4d42;
dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;
bmfhdr.bfSize=dwdibsize;
bmfhdr.bfReserved1=0;
bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
::GlobalUnlock(fdib);
::GlobalFree(fdib);
::CloseHandle(fh);
//////////////////////叠加字符
imgTransfer.Load(strpath);
strpath.Format( _T( "C:\\%s.jpg" ), strFileTitle);
imgTransfer.Save(strpath);
////////////////////////转回JPG



一共是3段,每段单独使用都没问题,可是放在一起就不行了,请问是什么原因?
...全文
141 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
absxiang 2010-05-24
  • 打赏
  • 举报
回复
恩,应该是可以。不过问题是我得研究下怎么装Cximage,今天弄了一下午都没装上,说明上说编译出的lib文件都放到一个文件夹里,可是我一编译就出一堆错误。
向立天 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 absxiang 的回复:]
唉~~~,是还没解决啊,这几天加班弄别的东西去了,本来是应该用数据库存储数据,不过我不会,所以用TXT文本代替进行读取,刚弄完这个功能,又转回来做这个叠加功能了,我试了一下午Cximage,可是按照说明就是没弄成功。
[/Quote]
一楼的代码应该可以吧
absxiang 2010-05-24
  • 打赏
  • 举报
回复
唉~~~,是还没解决啊,这几天加班弄别的东西去了,本来是应该用数据库存储数据,不过我不会,所以用TXT文本代替进行读取,刚弄完这个功能,又转回来做这个叠加功能了,我试了一下午Cximage,可是按照说明就是没弄成功。
向立天 2010-05-24
  • 打赏
  • 举报
回复
这个问题你还没解决
xiuxianshen 2010-05-24
  • 打赏
  • 举报
回复
楼上有点贴图的味道,呵呵
lizhigang34 2010-05-24
  • 打赏
  • 举报
回复
用CxImage给JPG文件添加文字,不需要这么麻烦啊,看下面的代码,已测试通过


void CCxImageTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码


CxImage imgJPG; // 定义一个CxImage对象
imgJPG.Load("1.jpg", CXIMAGE_FORMAT_JPG); //先装载jpg文件
// 判断加载的jpg文件是否存在。
if (imgJPG.IsValid())
{
//得到文件对应的HBITMAP
HBITMAP hbmp = imgJPG.MakeBitmap();

HWND hwnd = GetSafeHwnd();
HDC hdc = ::GetDC(hwnd);

HDC hdcMem = ::CreateCompatibleDC(hdc);
SelectObject(hdcMem, hbmp);

RECT rc = {50, 50, 200, 200};
::SetBkMode(hdcMem, TRANSPARENT);
::DrawText(hdcMem, "Hello World.", -1, &rc, DT_VCENTER);

CxImage imgBmp;
imgBmp.CreateFromHBITMAP(hbmp);
imgBmp.Save("1jpg.jpg", CXIMAGE_FORMAT_JPG);


::ReleaseDC(hwnd, hdc);
::DeleteDC(hdcMem);
::DeleteDC(hdc);

}
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧