문제

이전 질문 중 하나에서 나는 C 만 사용해야한다는 제약으로 인해 스크린 샷을 찍고 GDI+를 사용하지 않고 JPEG로 저장하는 방법을 물었습니다. 결국 일부의 도움으로 질문에 답했습니다. 거기에 댓글이 있습니다. 매우 Terse C 버전의 GDI+ (런타임에로드)를 사용하여 스크린 샷을 가져 와서 파일에 JPEG로 저장할 수 있습니다. 이제 동일한 스크린 샷을 파일이 아니라 버퍼에 어떻게 저장합니까? 서명되지 않은 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;
}

도와 주셔서 감사합니다.

도움이 되었습니까?

해결책

gdipsaveimagetofile을 호출하는 대신 gdipsaveimagetostream을 사용해야합니다. 이렇게하면 이미지를 파일에 쓰는 대신 스트림에 직접 저장할 수 있습니다.

참조 GDI 이미지 기능 자세한 내용은.

메모리에서 istream을 만들려면 사용할 수 있습니다. CreateStreamonhglobal. 이는 Istream이 자체 메모리를 할당하거나 사전 배치 된 버퍼를 사용할 수있는 옵션이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top