從資源中載入jpg, png到GDI+ Image
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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Hive從HDFS中載入資料
建表 以手機流量資訊為例插入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"); 載入之後就可以