1. 程式人生 > >從資源中載入jpg, png到GDI+ Image

從資源中載入jpg, png到GDI+ Image

從資源中載入jpg和png檔案, 貌似不應該是個大問題, 一google結果一大堆, 卻有兩個陷阱,trap啊

1, 是Bitmap(RT_BITMAP)型別的圖片無法載入, RT_BITMAP是預定義型別, 資源裡面沒有bmp檔案的頭, SizeofResource 的返回值要比圖片檔案少幾個位元組,因為少了這幾個位元組, 所以GDI+會返回invalid parameter錯誤。

2, 從IStream裡面創建出來的Image物件似乎會引用到堆裡面的記憶體, 如果hBuffer被釋放了, 建立的Image的內容就會被破壞,有時只能畫出一小部分圖片, 有時整個圖片就是空白, 視當時的記憶體狀況而定。呼叫Image的Clone也沒用。

CYourClass::~CYourClass()
{
    for(IMG_VECTOR::iterator it = m_arImage.begin(); it != m_arImage.end(); it++)
        delete *it;
    for(HGLB_VECTOR::iterator it = m_arGlobal.begin(); it != m_arGlobal.end(); it++)
    {
        ::GlobalUnlock(*it);
        ::GlobalFree(*it);
    }
}

void CYourClass::AddImage(HMODULE hInst, UINT nResourceID, LPCTSTR lpType)
{
    if(lpType == RT_BITMAP)
    {
        //GDI+ can not load RT_BITMAP resouce, 
        //because they are predefined resource, 
        //they don't contains the image file header.
        assert(FALSE);
        return;
    }

    HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), lpType);
    if (!hResource)
        return;

    DWORD imageSize = ::SizeofResource(hInst, hResource);
    if (!imageSize)
        return;

    const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
    if (!pResourceData)
        return;

    HGLOBAL hBuffer = ::GlobalAlloc(GMEM_FIXED, imageSize);
    if (NULL == hBuffer)
        return;

    void* pBuffer = ::GlobalLock(hBuffer);
    if (pBuffer)
    {
        CopyMemory(pBuffer, pResourceData, imageSize);
        IStream* pStream = NULL;
        if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
        {
            Gdiplus::Image * pImage = Gdiplus::Image::FromStream(pStream);
            pStream->Release();
            if (pImage)
            { 
                if (pImage->GetLastStatus() == Gdiplus::Ok &&
                    pImage->GetWidth() > 0)
                {
                    m_arImage.push_back(pImage);
                    //it seems the image will take usage of the global memory.
                    //so the global memory should be kept until the image destroy.
                    m_arGlobal.push_back(hBuffer);
                    return;
                }

                delete pImage;
            }
        }
        ::GlobalUnlock(hBuffer);
    }
    ::GlobalFree(hBuffer);
}


相關推薦

資源載入jpg, png到GDI+ Image

從資源中載入jpg和png檔案, 貌似不應該是個大問題, 一google結果一大堆, 卻有兩個陷阱,trap啊1, 是Bitmap(RT_BITMAP)型別的圖片無法載入, RT_BITMAP是預定義型別, 資源裡面沒有bmp檔案的頭, SizeofResource 的返

Win32資源載入PNG圖片,然後建立GDI+的Image物件

void LoadPNGFromStaticRes(HMODULE hModule, UINT nResId, Image** ppImg) { HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(nResId), TEXT("PNG"))

在VC使用GDI+自定義資源載入圖片

函式定義: BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Image * & pImg) { HINSTANCE hInst = AfxGetResourceHandle(); HRSRC hRsrc = ::Find

啟動伺服器時將配置引數資料庫載入到快取

最近做專案,碰到這樣的需求:在伺服器啟動的時候從資料庫讀取引數,將引數儲存到記憶體快取中 由於使用的是spring的自動注入方式,一開始用@component註解在啟動的時候載入查詢配置引數的bean,由於bean中要用到其他bean來查詢,但此時都為null 查詢相關資料,發現@PostC

Springboot 類不能使用@Value註解yml載入

對於下面的類,使用了@Value,但是不能從yml中讀取值,怎麼辦? 帶有@Value標籤類: package com.itmuch.cloud; import org.springframework.beans.factory.annotation.Value; import org

OllyDbg IDA pro強強聯合 OllyDbg載入IDA Pro輸出的map資訊檔案,帶符號資訊除錯

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

HiveHDFS載入資料

建表         以手機流量資訊為例插入30w行資料   create table flow(id string,phonenum string,mac string,ip string,num1 int,num2 int,up in

vc資源載入png圖片以及顯示

因要做一個小的登陸客戶端,所用圖片格式為png.但較少,所以想直接放到資源中.碰到的第一個問題是.net2003中載入png圖片到資源中總是不成功.試了下發現jpg也不行,jpg圖片會提示"不是正確的JPEG格式",後來用vc6.0開啟資原始檔載入成功的.vs2003中原因還未找到,有知道

Opengl如何磁碟載入圖片生成紋理物件

IplImage* imgBGR = cvLoadImage(szPathName); IplImage* imgRGB = cvCreateImage(cvGetSize(imgBGR), 8, 3); cvCvtColor(imgBGR,imgRGB,CV_BGR2RG

iOS-設定UITableViewCell之間的間距, xib載入另一個xib

重新設定的UITableViewCellframe。 程式碼如下: #import "MyViewCell.h" @implementation MyViewCell - (void)awakeFromNib { [super

android 資源獲取陣列以及ArrayAdapter

原文轉自: 除了在Java程式碼中定義陣列,Android還提供了在資源中定義陣列,然後在Java程式碼中解析資源,從而獲取陣列的方法。實際開發中,推薦將資料存放在資原始檔中,以實現程式的邏輯程式碼與資料分離,便於專案的管理,儘量減少對Java程式碼的修改。 在資源中

【Qt OpenGL教程】25:變形和檔案載入3D物體

第25課:變形和從檔案中載入3D物體 (參照NeHe) 這次教程中,我們將學會如何從檔案中載入3D模型,並且平滑的從一個模型變形為另一個模型。在這一課裡,我們將介紹如何實現模型的變形過程,這將會是效果很棒的一課! 程式執行時效果如下: 下面進入教程: 我們這次將在第

關於在struts2利用jquery如何動態資料庫載入圖片並顯示

本來我一開始總是在想,我該如何利用jquery的$ajax()方法來動態獲得圖片然後在改變現有img標籤圖片的內容呢? 查了好久,但一直沒發現滿意的,突然我從最基本的獲得圖片得到靈感。 首先,我是直接把圖片以blob型別存到資料庫中的,利用hibernate配置好的。 只

delphi -- GDi+ Delphi如何讓 TGPImage 直接載入圖片

方法一: Delphi 的 TBitmap 類可以方便地操作流, 如果能讓 TGPImage 和 TBitmap 溝通起來就好了; TGPImage 有一個子類 TGPBitmap 可以和 TBitmap 溝通... ok 了! 程式碼如下: uses GDIPOBJ, GDIPAPI; procedure

AssetBundle獲取圖片,給Image 元件替換Sprite

從AssetBundle中獲取圖片並給Image 元件替換Sprite 1.用Texture2D做過渡 C# Texture2D tex = bundle.LoadAsset<Texture2D&

hive 自定定義函式 hdfs載入jar

1、編寫函式 package com.example.hive.udf;   import org.apache.hadoop.hive.ql.exec.UDF;   import org.apache.hadoop.io.Text;   public final cl

記憶體載入DLL (修正版)

轉載地址: http://www.freshbug.com/archives/39 ====================================================== 程式使用動態庫DLL一般分為隱式載入和顯式載入兩種,分別對應兩種連

Java Web系統初始化時資料庫載入資料到文字(ibatis,spring)

有一些特殊情況,需要在系統初始化時載入一些配置屬性到本地文字中 web.xml <listener> <listener-class> org.springfra

Windows注入與攔截(6) -- 記憶體載入DLL

Windows提供的API(LoadLibrary, LoadLibraryEx)只支援從檔案系統上載入DLL檔案,我們無法使用這些API從記憶體中載入DLL。 但是有些時候,我們的確需要從記憶體中載入DLL,比如: 對釋出的檔案數量有限制。我們可以將DL

cocos2dx載入圖片資源的方法,和記憶體獲取已經載入的圖片資源的方法 以及釋放問題

遊戲中通常需要將常用的資源如:聲音,圖片,plist檔案,提前載入進記憶體,以加快遊戲的流暢度 1.預載入聲音: SimpleAudioEngine::getInstance()->preloadBackgroundMusic("boom.mp3"); 載入之後就可以