有一个图形对象,保存在IPicture中,我想从其中取出一指定矩形区域,并保存入另一个图形对象中,并获得其IPicture接口,如何做到呢?谢谢!!

解决方案 »

  1.   

    我记得IPicture没有提供这样的功能。
    你可以先将要得到的区域画在一个内存设备上,得到他的位图句柄,再把位图存入另一个IPicture中。我觉得得到位图句柄就可以作任何事了,没有必要再要一个IPicture了。
      

  2.   

    如何通过位图句柄将位图存入一个新的IPicture中呢?
    我是需要实现这样一个方法
    谢谢
      

  3.   

    在VC中可以用:
    CDC::BitBlt()
    具体可以参考:MSDN==>CDC:Bitmap Functions
      

  4.   

    好像没有直接的方法。我以前是这样做的:
    IPicuture->Render到一个BITMAP上
    然后把这个BITMAP中你需要的再放到IPicture里面,一般用用没什么问题,几百MB的超大图片可能效率会底些。
      

  5.   

    把这个BITMAP中你需要的再放到IPicture里面,怎么做呢?
      

  6.   

    //hGlobal 就是你的图片数据了,注意BITMAPINFOHEADER也要加在数据段前面
    IStream* pStream = NULL;
    if(S_OK == CreateStreamOnHGlobal(hGlobal, TRUE, &pStream)  )
    {
        OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&m_IPicture);
    }
    ----
    刚才copy少了。。呵呵
      

  7.   

    To harry202(harry):
    hGlobal中的数据是什么?怎么存入呢?要完全由自己创建关于图片的信息吗?
      

  8.   

    给你一段从文件读入到IPicture的代码把,从内存读的代码我这里和其他代码交织在一起,很难提出来,但有了这段,其他不难写出。
    自己创建需要建立图片信息
    CFile PictureFile;
    CFileException e;
    int nSize = 0;
    if(PictureFile.Open(sFilePathName, CFile::modeRead | CFile::typeBinary, &e))
    {
    nSize = PictureFile.GetLength();
    BYTE* pBuffer = new BYTE[nSize];

    if(PictureFile.Read(pBuffer, nSize) > 0 )
    {
    //LoadPictureData就是我上面的代码了
    if(LoadPictureData(pBuffer, nSize))
    bResult = TRUE;
    }
    PictureFile.Close();
    delete [] pBuffer;
    }
      

  9.   

    非常感谢,我知道我的问题的原因了,不是我写的代码的问题。
    我用的是VS.net,使用了其中的CImage类,它其中的Save函数,大致调用了如下方式:
    Gdiplus::Bitmap bm( m_hBitmap, NULL );
    status = bm.Save( pStream, &clsidEncoder, NULL );
    但是,Gdiplus与VB.net兼容,但是与VB6写的程序似乎不兼容,所以我以为是我代码的问题,提取问题的重点后,有以上一问。
    非常感谢你的回答,稍后给分。再次对你的热心帮助表示感谢!
      

  10.   

    vb6和gdi+不兼容?那我以后要当心点了vc6我用过,好像没什么问题。