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)。
この方法は非常に簡単ですが、私の実験によれば、この方法は本当に落ち込んで、ロードされていないだけで絵にJPG / PNGおよび他のフォーマットへのBMP形式を読み込むように思われます。
2. COMを使用して、私は次のように私は、コードを整理、この方法にアモイ淘宝網にいくつかの時間前CodeGuru:
HBITMAP LoadImageFromFile(PCTSTR pszBitmapFile)
{
IPictureを * pIPic。
IStream * pStream = NULL ;
HGLOBAL HGLOBAL ;
無効 * PVOID。
FILEの * FP = NULL ;
fopen_s(&FP、CT2A(pszBitmapFile)、"RB" )。
もし(FP == NULL)戻り NULL ;
fseek関数(FP、0、SEEK_END)。
長い LFS = ftellは(FP)。
fseek関数(FP、0、SEEK_SET)。
HGLOBAL = のGlobalAlloc(GPTR、LFS)。
もし(HGLOBAL == NULL)
{
FCLOSE(FP)。
リターン NULL ;
}
PVOID =(ボイド *)HGLOBAL。
関数fread(PVOID、1、LFS、FP)。
FCLOSE(FP)。
//のIStreamそうIPictureをすることができます作成します。
もし(FAILED(CreateStreamOnHGlobal(HGLOBAL、FALSE、&pStream)))
{
GlobalFree(HGLOBAL)。
リターン 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の 画像ファイルのマスター一般的な構造は、読み込まれたデータストリームを分析することができます。通りすがりの私のような人々のためとして、非常に複雑に従事していません。はい、 使用するために、比較的大規模なオープンソースプロジェクトのCxImage、eDonkeyのソースコードがあり 、それは。
ます。https://my.oschina.net/dake/blog/196856で再現