4

以前の質問の1つで、Cのみを使用する必要があるという制約のため、GDI +を使用せずにスクリーンショットを撮ってJPEGとして保存する方法を尋ねました。最後に、いくつかの助けを借りて自分で質問に答えました。そこにコメント。非常に簡潔なCバージョンのGDI+(実行時にロードされる)を使用して、スクリーンショットを撮り、それをJPEGとしてファイルに保存できます。では、同じスクリーンショットをファイルではなくバッファに保存するにはどうすればよいですか?unsigned char *バッファ?変換する必要のあるコードは次のとおりです。

int SaveJpeg(HBITMAP hBmp, LPCWSTR lpszFilename, ULONG uQuality)
{
    ULONG *pBitmap = NULL;
    CLSID imageCLSID;
    EncoderParameters encoderParams;
    int iRes = 0;

    typedef Status (WINAPI *pGdipCreateBitmapFromHBITMAP)(HBITMAP, HPALETTE, ULONG**);
    pGdipCreateBitmapFromHBITMAP lGdipCreateBitmapFromHBITMAP;

    typedef Status (WINAPI *pGdipSaveImageToFile)(ULONG *, const WCHAR*, const CLSID*, const EncoderParameters*);
    pGdipSaveImageToFile lGdipSaveImageToFile;

    // load GdipCreateBitmapFromHBITMAP
    lGdipCreateBitmapFromHBITMAP = (pGdipCreateBitmapFromHBITMAP)GetProcAddress(hModuleThread, "GdipCreateBitmapFromHBITMAP");
    if(lGdipCreateBitmapFromHBITMAP == NULL)
    {
        // error
        return 0;
    }

    // load GdipSaveImageToFile
    lGdipSaveImageToFile = (pGdipSaveImageToFile)GetProcAddress(hModuleThread, "GdipSaveImageToFile");
    if(lGdipSaveImageToFile == NULL)
    {
        // error
        return 0;
    }

        lGdipCreateBitmapFromHBITMAP(hBmp, NULL, &pBitmap);

       iRes = GetEncoderClsid(L"image/jpeg", &imageCLSID);
       if(iRes == -1)
    {
        // error
        return 0;
    }
    encoderParams.Count = 1;
    encoderParams.Parameter[0].NumberOfValues = 1;
    encoderParams.Parameter[0].Guid  = EncoderQuality;
    encoderParams.Parameter[0].Type  = EncoderParameterValueTypeLong;
    encoderParams.Parameter[0].Value = &uQuality;

    lGdipSaveImageToFile(pBitmap, lpszFilename, &imageCLSID, &encoderParams);


    return 1;
}

助けてくれてありがとう。

4

1 に答える 1

3

GdipSaveImageToFile を呼び出す代わりに、GdipSaveImageToStream を使用する必要があります。これにより、画像をファイルに書き込む代わりに、ストリームに直接保存できます。

詳細については、GDI イメージ関数を参照してください。

メモリ内に IStream を作成するには、 CreateStreamOnHGlobalを使用できます。これには、IStream が独自のメモリを割り当てるか、事前に割り当てられたバッファを使用できるようにするオプションがあります。

于 2009-06-23T19:41:56.200 に答える