ソフトウェア開発 Win32プログラミング

GDI+を使ってビットマップを画像として保存する

戻る


GDI+を使ってビットマップを画像として保存したい場合は、次のような コードを使うとよい。

#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;

#include <cstdlib>
#include <cstring>
using namespace std;

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0, size = 0;

    GetImageEncodersSize(&num, &size);
    if (size == 0)
        return -1;  // Failure

    ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)malloc(size);
    if (pImageCodecInfo == NULL)
        return -1;  // Failure

    GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }
    }

    free(pImageCodecInfo);
    return -1;  // Failure
}

BOOL SaveBitmapAsPngFile(LPCSTR pszFileName, HBITMAP hbm)
{
    WCHAR wszFileName[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, wszFileName, MAX_PATH);

    CLSID clsid;
    Bitmap b(hbm, (HPALETTE)GetStockObject(DEFAULT_PALETTE));
    if (GetEncoderClsid(L"image/png", &clsid) >= 0)
    {
        b.Save(wszFileName, &clsid, NULL);
        return TRUE;
    }
    return FALSE;
}

BOOL SaveBitmapAsJpegFile(LPCSTR pszFileName, HBITMAP hbm)
{
    WCHAR wszFileName[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, wszFileName, MAX_PATH);

    CLSID clsid;
    Bitmap b(hbm, (HPALETTE)GetStockObject(DEFAULT_PALETTE));
    if (GetEncoderClsid(L"image/jpeg", &clsid) >= 0)
    {
        b.Save(wszFileName, &clsid, NULL);
        return TRUE;
    }
    return FALSE;
}

BOOL SaveBitmapAsGifFile(LPCSTR pszFileName, HBITMAP hbm)
{
    WCHAR wszFileName[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, wszFileName, MAX_PATH);

    CLSID clsid;
    Bitmap b(hbm, (HPALETTE)GetStockObject(DEFAULT_PALETTE));
    if (GetEncoderClsid(L"image/gif", &clsid) >= 0)
    {
        b.Save(wszFileName, &clsid, NULL);
        return TRUE;
    }
    return FALSE;
}

BOOL SaveBitmapAsTiffFile(LPCSTR pszFileName, HBITMAP hbm)
{
    WCHAR wszFileName[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, wszFileName, MAX_PATH);

    CLSID clsid;
    Bitmap b(hbm, (HPALETTE)GetStockObject(DEFAULT_PALETTE));
    if (GetEncoderClsid(L"image/tiff", &clsid) >= 0)
    {
        b.Save(wszFileName, &clsid, NULL);
        return TRUE;
    }
    return FALSE;
}

#ifdef UNITTEST
HBITMAP CreateWindowBitmap(HWND hWnd)
{
    ...
}

int main(void)
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    
    // GDI+の初期化。
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
    HBITMAP hbm = CreateWindowBitmap(GetDesktopWindow());
    SaveBitmapAsPngFile("a.png", hbm);
    SaveBitmapAsJpegFile("a.jpg", hbm);
    SaveBitmapAsGifFile("a.gif", hbm);
    SaveBitmapAsTiffFile("a.tif", hbm);
    DeleteObject(hbm);
    
    // GDI+の後処理。
    GdiplusShutdown(gdiplusToken);
}
#endif  // def UNITTEST

なお、このコードをコンパイルするには、GDI+のインポートライブラリが必要であり、 実行するのに gdiplus.dll が必要となる。

ソース: savepic.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system