ファイルからVCロード画像

MFC GDIは 友人に確かに馴染みの開発 CBitmapの カプセル化するクラス HBITMAPの 上簡素化、オブジェクトを HBITMAP のAPI などの操作、LoadBitmapの方法は、直接リソースに指定されたロードできるID 絵の、多くの場合、我々はファイルからロードする必要があります絵は、CBitmapのクラスでは、このような方法を提供していませんでした。

私が知っているファイルから画像をロードするにはいくつかの方法を要約下:

 

1. 使用し たAPI 関数 LoadImage 、指定された LR_LOADFROMFILEの フラグ。以下のような:

HBITMAP HBITMAP =(HBITMAP):: LoadImageNULLstrPathIMAGE_BITMAP、0、0、LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE)。

この方法は非常に簡単ですが、私の実験によれば、この方法は本当に落ち込んで、ロードされていないだけで絵にJPG / PNGおよび他のフォーマットへのBMP形式を読み込むように思われます。

 

2. COMを使用して、私は次のように私は、コードを整理、この方法にアモイ淘宝網にいくつかの時間前CodeGuru:

HBITMAP LoadImageFromFilePCTSTR pszBitmapFile

{

      IPictureを * pIPic

      IStream * pStream   = NULL ;

      HGLOBAL HGLOBAL ;

      無効 * PVOID

 

      FILEの * FP = NULL ;

      fopen_s(&FPCT2ApszBitmapFile)、"RB" )。

 

      もしFP == NULL戻り NULL ;

 

      fseek関数FP、0、SEEK_END)。

      長い LFS = ftellはFP)。

      fseek関数FP、0、SEEK_SET)。

      HGLOBAL = のGlobalAllocGPTRLFS)。

      もしHGLOBAL == NULL

      {

           FCLOSEFP)。

           リターン NULL ;

      }

      PVOID =(ボイド *)HGLOBAL

      関数freadPVOID、1、LFSFP)。     

      FCLOSEFP)。

 

      //のIStreamそうIPictureをすることができます作成​​します。

        もしFAILEDCreateStreamOnHGlobalHGLOBALFALSE、&pStream)))

        {

             GlobalFreeHGLOBAL)。

             リターン 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で再現

おすすめ

転載: blog.csdn.net/weixin_34391445/article/details/91586259