VC從檔案中載入圖片
VC從檔案中載入圖片
用MFC做GDI開發的朋友肯定熟悉CBitmap類,該類封裝了HBITMAP物件,簡化了關於HBITMAP的API操作,如LoadBitmap方法可直接載入資源中指定ID的圖片,但是很多情況下我們需要從檔案中載入圖片,CBitmap類就沒有提供這樣的方法了。
下面我總結幾種我知道的從檔案載入圖片的方法:
1.使用API函式LoadImage,指定LR_LOADFROMFILE標誌。如:
HBITMAP hBitmap = (HBITMAP) ::LoadImage(NULL, strPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
這種方式十分簡潔,但是根據我的實驗,此方法貌似只能載入bmp格式的圖片,對於jpg/png等格式都載入不了,真是鬱悶。
2.利用COM,我前段時間在CodeGuru淘到這個方法,我把程式碼整理了一下,如下所示:
HBITMAP LoadImageFromFile( PCTSTR pszBitmapFile )
{
IPicture* pIPic;
IStream* pStream = NULL;
HGLOBAL hGlobal;
void* pVoid;
FILE *fp = NULL;
fopen_s( &fp, CT2A( pszBitmapFile ),"rb" );
if ( fp == NULL )return NULL;
fseek( fp, 0, SEEK_END );
long lFS = ftell(fp);
fseek( fp, 0, SEEK_SET );
hGlobal = GlobalAlloc( GPTR, lFS );
if ( hGlobal == NULL)
{
fclose(fp);
return NULL;
}
pVoid = (void*)hGlobal;
fread( pVoid, 1, lFS, fp );
fclose( fp );
// Create an IStream so IPicture can
if( FAILED( CreateStreamOnHGlobal( hGlobal,FALSE,&pStream) ) )
{
GlobalFree(hGlobal);
return NULL;
}
HRESULT hr = OleLoadPicture( pStream, 0, TRUE, IID_IPicture, (void**)&pIPic);
pStream->Release();
GlobalFree(hGlobal);
if( FAILED(hr) )
{
return NULL;
}
HBITMAP hBitmap = NULL;
pIPic->get_Handle( ( unsigned int*)&hBitmap );
HBITMAP hBitmapRet = (HBITMAP)CopyImage( hBitmap, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG );
pIPic->Release();
return hBitmapRet;
}
實驗表明:這段程式碼可以載入JPG/GIF/BMP,對png格式載入不了。不能使用框架的朋友可以試試這段程式碼,不過要注意,由於使用了COM,記得使用之前要初始化COM。
3.第三種方式,也是我經常採取的方式,就是使用ATL和MFC的共享類Cimage。這個類十分強大,從它數千行的原始碼中就可以看出。然弱水三千,只取一瓢。用它從檔案載入圖片,只算牛刀小試。
CImage img;
img.Load( strPath );
if( !img.IsNull() )
{
HBITMAP hBitmap = img.Detach();
}
我實驗過的圖片都能載入,而且很快。使用別的框架的朋友可以去研究一下Cimage的原始碼,封裝載入圖片的功能,絕對比第二種使用COM載入的方法實用多了,也方便多了。
其他:理解HBITMAP結構的高手一般可以直接讀取圖片檔案,分析資料流的。至於像我這樣路過的人,不用搞那麼複雜的了。
相關文章
- oracle 載入圖片檔案Oracle
- 載入常量-從檔案中載入
- 圖片寫入pdf檔案
- Vue中圖片的載入方式Vue
- 圖片預載入,圖片懶載入,和jsonp中的一個疑問JSON
- ImageView中圖片儲存到檔案View
- Flutter 圖片載入Flutter
- 圖片懶載入
- 預載入圖片
- 圖片載入事件事件
- 載入圖片方式
- 從CSV檔案中讀取jpg圖片的URL地址並多執行緒批量下載執行緒
- 圖片預載入和懶載入
- 載入JPGE圖象檔案到DirectDraw的表面中(轉)
- vc實現https檔案下載HTTP
- 圖片懶載入(IntersectionObserver)Server
- 圖片懶載入原理
- 委託載入圖片
- 載入遠端圖片
- 專案分享六:圖片的延遲載入
- 載入本地圖片模糊,Glide載入網路圖片卻很清晰地圖IDE
- C#中PictureBox非同步載入圖片C#非同步
- Pr 入門教程如何處理圖片檔案?
- 要優雅!Android中這樣載入大圖片和長圖片Android
- 在VC中自建操作BMP點陣圖檔案的類 (轉)
- AXIOS從伺服器載入圖片並顯示iOS伺服器
- TestFlight下載App,載入圖片失效。Xcode安裝App,圖片載入正常。APPXCode
- 圖片檔案上傳
- Android 載入大圖片,不壓縮圖片Android
- 解耦圖片載入庫解耦
- 圖片懶載入踩坑
- 圖片懶載入大白話
- 圖片懶載入實現
- Android 圖片載入框架Android框架
- glide圖片載入原理IDE
- React Native 載入圖片React Native
- 載入圖片的問題
- HTML使用canvas載入圖片HTMLCanvas