문제
이전 질문 중 하나에서 나는 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이 자체 메모리를 할당하거나 사전 배치 된 버퍼를 사용할 수있는 옵션이 있습니다.
제휴하지 않습니다 StackOverflow