破帽遮颜 发表于 2010-6-22 03:25:49

求助高手帮忙能否将一小段VC转成AU3

本帖最后由 破帽遮颜 于 2010-6-22 19:08 编辑

BOOL CJPGRES2BMPView::JpgRes2Bmp(UINT ResourceName, LPCSTR ResourceType, HBITMAP *lphBmp)
{
    HGLOBAL      hGlobal = NULL;
    HRSRC      hSource = NULL;
    LPVOID      lpVoid= NULL;
    int            nSize   = 0;

    IPicture* p_IPicture = NULL;
    OLE_HANDLE hJpegBmp = 0;
   

    // 1. 从资源中读取JPG文件数据
    hSource = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(ResourceName), ResourceType);
    if(hSource == NULL)
    {
      return(FALSE);
    }
   
    hGlobal = LoadResource(AfxGetResourceHandle(), hSource);
    if(hGlobal == NULL)
    {
      return(FALSE);
    }
   
    lpVoid = LockResource(hGlobal);
    if(lpVoid == NULL)
    {
      return(FALSE);
    }
   
    nSize = (UINT)SizeofResource(AfxGetResourceHandle(), hSource);

    // 2. 分配内存并拷贝数据
    HGLOBAL hGlobalMem = GlobalAlloc(GMEM_MOVEABLE, nSize);
    if(hGlobalMem == NULL)
    {
      return(FALSE);
    }
   
    void* pData = GlobalLock(hGlobalMem);
    memcpy(pData, (BYTE*)hGlobal, nSize);
    GlobalUnlock(hGlobalMem);
   

    // 3. 创建Stream
    IStream* pStream = NULL;
    if(CreateStreamOnHGlobal(hGlobalMem, TRUE, &pStream) == S_OK)
    {
      HRESULT hr;
      if(E_NOINTERFACE == (hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&p_IPicture)))
      {
            return(FALSE);
      }
      else // S_OK
      {
            pStream->Release();
            pStream = NULL;
      }
    }
   
    // MSDN:not necessary for Win32-based applications
    UnlockResource(hGlobal);
    FreeResource(hGlobal);
    FreeResource(hGlobalMem);

    // 4.得到图像句柄,拷贝
    if(p_IPicture != NULL)
    {
      // Get the handle to the image, and then copy it.
      if((p_IPicture->get_Handle(&hJpegBmp)) != S_OK)
      {
            p_IPicture->Release();
            p_IPicture = NULL;
            *lphBmp = 0;
            return(FALSE);
      }
      
      if((*lphBmp = (HBITMAP)CopyImage((HANDLE *) hJpegBmp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)) == NULL)
      {
            p_IPicture->Release();
            p_IPicture = NULL;
            *lphBmp = 0;
            return(FALSE);
      }
      
      p_IPicture->Release();
      p_IPicture = NULL;

      return(TRUE);
    }
    else
    {
      p_IPicture->Release();
      p_IPicture = NULL;
      return(FALSE);
    }

}

pusofalse 发表于 2010-6-22 03:27:55

看过了,不会弄,在OleLoadPicture那里测试失败了。

afan 发表于 2010-6-22 03:29:43

这回帖速度

破帽遮颜 发表于 2010-6-22 03:39:27

看过了,不会弄,在OleLoadPicture那里测试失败了。
pusofalse 发表于 2010-6-22 03:27 http://www.autoitx.com/images/common/back.gif


5555555~~~~~
实在找不到办法了~~~~~

C.L 发表于 2010-6-22 08:53:56

VC转AU3总是比较困难

AU3实现这个是否可以用别的途径来实现上面的要求?没写过这种代码,不清楚,不过我下面的思路是否可行?

1、用AU3自行读取资源文件的JPG数据
2、将JPG数据放入内存,返回内存中数据的起启位置
3、如何将内存的起启位置转成位图句柄?(没有思路)

MakeFire 发表于 2010-6-22 09:34:04

这是干哈呢,有哈用呢

破帽遮颜 发表于 2010-6-22 09:34:38

VC转AU3总是比较困难

AU3实现这个是否可以用别的途径来实现上面的要求?没写过这种代码,不清楚,不过我 ...
C.L 发表于 2010-6-22 08:53 http://www.autoitx.com/images/common/back.gif

这样能不能成功呢
将jpg或者png在内存中转为位图,再读取位图句柄?
这样避免了将jpg转成bmp位图临时文件再进行读取的繁琐。不需要产生垃圾文件。
但如果图片多的情况下,会不会产生占用内存多的问题?

C.L 发表于 2010-6-22 10:35:48

回复 7# 破帽遮颜


这样能不能成功呢
将jpg或者png在内存中转为位图,再读取位图句柄?
这样避免了将jpg转成bmp位图临时文件再进行读取的繁琐。不需要产生垃圾文件。
但如果图片多的情况下,会不会产生占用内存多的问题?


在内存中转换应该是可行,不过应该要自行处理将JPG头转换成BMP位图头,这个操作可是有点繁杂
如果图片多,占用内存肯定会很多。

破帽遮颜 发表于 2010-6-22 10:41:10

回复 8# C.L

希望各位大大帮忙解决!
页: [1]
查看完整版本: 求助高手帮忙能否将一小段VC转成AU3