以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  如何在VC++中实现Gdi与jpg图片的合并?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=88561)


--  作者:葛靖青001
--  发布时间:12/7/2010 3:16:00 PM

--  如何在VC++中实现Gdi与jpg图片的合并?
【转自互联网】

合并两张jpg图片为一张jpg图片,思路是先把两张图片jpg图片都转化成bmp图片,然后把两张bmp图片合并成一张bmp图片,然后是把这张bmp图片转化为jpg图片。

  一。jpg,bmp互相转化

  /*********************************

  format:bmp转为jpg, format为image/jpeg,jpg转为bmp,format为image/bmp

  strDst为最终转化结果的图片路径

  strSrc为原来图片的路径

  **********************************/

  BOOL ConvertPic(const WCHAR *format, const CString &strDst, const CString &strSrc)

  {

  BOOL bConvert = false;

  CLSID clsid;

  int nRet = 0;

  nRet = GetEncoderClsid(format,&clsid);  //得到CLSID

  USES_CONVERSION;

  if (nRet>=0)

  {

  Image image(A2W(strSrc));

  image.Save(A2W(strDst),&clsid,NULL);

  bConvert = true;

  }

  return bConvert;

  }

  其中GetEncoderClsid函数如下:

  /*****************************************************

  返回值为-1表示失败,其他为成功

  ******************************************************/

  int GetEncoderClsid(const WCHAR *format, CLSID *pClsid)

  {

  int nRet = -1;

  ImageCodecInfo * pCodecInfo = NULL;

  UINT nNum = 0,nSize = 0;

  GetImageEncodersSize(&nNum,&nSize);

  if (nSize<0)

  {

  return nRet;

  }

  pCodecInfo = new ImageCodecInfo[nSize];

  if (pCodecInfo==NULL)

  {

  return nRet;

  }

  GetImageEncoders(nNum,nSize,pCodecInfo);

  for (UINT i=0; i<nNum; i++)

  {

  if (wcscmp(pCodecInfo[i].MimeType,format)==0)

  {

  *pClsid = pCodecInfo[i].Clsid;
nRet = i;

  delete[] pCodecInfo;

  return nRet;

  }

  else

  {

  continue;

  }

  }

  delete[] pCodecInfo;

  return nRet;

  }

  bmp转化为jpg

  ConvertPic(L"image/jpeg","c:\\1.jpg","c:\\1.bmp")

  jpg转化为bmp

  ConvertPic(L"image/bmp","c:\\1.bmp","c:\\1.jpg")

  二。bmp图片合并

  BOOL CombinePic(const WCHAR *format, const CString &strDst, const CString &strPic1,
  const CString &strPic2)

  {

  BOOL bCombine = false;

  int nRet = 0;

  CLSID clsid;

  nRet = GetEncoderClsid(format,&clsid);

  if (nRet>=0)

  {

  USES_CONVERSION;

  Bitmap bmp1(A2W(strPic1));

  Bitmap bmp2(A2W(strPic2));

  int nWidth = 0, nHeight = 0;

  nWidth = bmp1.GetWidth();   //假设两图片大小同

  nHeight = bmp1.GetHeight();

  Bitmap bmpCombine(2*nWidth,nHeight);  //高不变,宽*2,水平合并

  Graphics * pG = NULL;

  pG = Graphics::FromImage(&bmpCombine);

  if (pG!=NULL)

  {

  pG->DrawImage(&bmp1,0,0);

  pG->DrawImage(&bmp2,nWidth,0);

  bmpCombine.Save(A2W(strDst),&clsid,NULL);

  }

  }

  return bCombine;

  }

  例子:

  CombinePic(L"image/bmp","12.bmp","1.bmp","2.bmp");

  有了上面的功能,其他的就没问题了


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms