我想把硬盘下的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段,每段单独使用都没问题,可是放在一起就不行了,请问是什么原因?

解决方案 »

  1.   

    用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);

    }
    }
      

  2.   

    唉~~~,是还没解决啊,这几天加班弄别的东西去了,本来是应该用数据库存储数据,不过我不会,所以用TXT文本代替进行读取,刚弄完这个功能,又转回来做这个叠加功能了,我试了一下午Cximage,可是按照说明就是没弄成功。
      

  3.   

    恩,应该是可以。不过问题是我得研究下怎么装Cximage,今天弄了一下午都没装上,说明上说编译出的lib文件都放到一个文件夹里,可是我一编译就出一堆错误。