Windowsコード集 上のページ

#0006 SUSIEプラグインでの画像ロード

閲覧者さんからのリクエストです。
グラフィックビューアとして有名なフリーソフトウェアであるSUSIE(作者:たけちん氏)のプラグインを利用した、画像ロード関数です。
プラグインと画像ファイルを指定する事により、Windows APIでのLoadBitmapに相当する画像ロードが実現されています。

このソースをコンパイルするときには、別途 spi_plugin.h が必要です。
// オープンマクロ
#define CreateFile_Read(filename)       (CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))
#define CreateFile_Create(filename)     (CreateFile(filename,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,   FILE_ATTRIBUTE_NORMAL,NULL))
#define CreateFile_Write(filename)      (CreateFile(filename,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))

// ヒープマクロ
#define Heap_Malloc(size)               (HeapAlloc(GetProcessHeap(),0,size))
#define Heap_ReAlloc(mem,size)          (HeapReAlloc(GetProcessHeap(),0,mem,size))
#define Heap_Free(mem)                  (HeapFree(GetProcessHeap(),0,mem))

//----------------------------------------------------------------------------
// SUSIEプラグインを使った画像のロード
//----------------------------------------------------------------------------
// HBITMAP Spi_LoadImage(
//   LPSTR plugin,             // SUSIEプラグイン(*.spi)のファイルパス名
//   LPSTR filename            // ロードするファイルパス名
// );
//
// 関数が成功したときロードした画像のBITMAPハンドルを返す。
// 失敗したときは、NULLを返す。
//----------------------------------------------------------------------------
HBITMAP Spi_LoadImage(LPSTR plugin,LPSTR filename)
{
    // プラグインのロード
    HMODULE module = NULL;
    if((module = LoadLibrary(plugin)) == NULL)return NULL;

    // プラグイン関数の取得
    SPI_ISSUPPORTED spi_issupported = (SPI_ISSUPPORTED)GetProcAddress(module,SPIPROC_ISSUPPORTED);
    SPI_GETPICTURE  spi_getpicture  = (SPI_GETPICTURE )GetProcAddress(module,SPIPROC_GETPICTURE);
    if(spi_issupported == NULL || spi_getpicture == NULL){
        FreeLibrary(module);
        return NULL;
    }

    // ファイル内容をロードする
    HANDLE handle = NULL;
    if((handle = CreateFile_Read(filename)) == INVALID_HANDLE_VALUE){
        FreeLibrary(module);
        return NULL;
    }
    DWORD filesize = GetFileSize(handle,NULL),readsize;
    LPSTR data = (LPSTR)Heap_Malloc(filesize);
    SetFilePointer(handle,0,NULL,FILE_BEGIN);
    if(!ReadFile(handle,data,filesize,&readsize,NULL)){
        CloseHandle(handle);
        FreeLibrary(module);
    }
    CloseHandle(handle);

    // ロードできる形式かどうかをチェックする
    if(spi_issupported(filename,(DWORD)data) == 0){
        Heap_Free(data);
        FreeLibrary(module);
        return NULL;
    }

    // 画像を展開する
    HLOCAL info,bm;
    if(spi_getpicture(data,filesize,1,&info,&bm,NULL,0) != 0){
        Heap_Free(data);
        FreeLibrary(module);
        return NULL;
    }
    LPBITMAPINFO bmpinfo = (LPBITMAPINFO)LocalLock(info);   // BITMAPINFO構造体
    LPBYTE bmbits = (LPBYTE)LocalLock(bm);                  // 画像データ

    // 取得した情報からBITMAPハンドルを生成する
    HDC dc = GetDC(0);
    HBITMAP bitmap = CreateDIBitmap(dc,&bmpinfo->bmiHeader,CBM_INIT,bmbits,bmpinfo,DIB_RGB_COLORS);
    ReleaseDC(0,dc);

    // いろいろと開放
    LocalUnlock(info);
    LocalFree(info);
    LocalUnlock(bm);
    LocalFree(bm);
    Heap_Free(data);
    FreeLibrary(module);

    return bitmap;
}




上のページ