画面キャプチャしたHBITMAPをJPEG圧縮する際に、ファイルに出力することはできたので
すが、できればファイルでなくメモリ上に出力したいのですが、やり方を教えて頂けませ
んでしょうか?
int
CServerModule::GetJpegImage(char **image, int nQuality)
{
// クリップボードのデータをJPGファイルに変換して保存
UINT format;
bool img_flg = false;
HBITMAP hBitmap;
int ret = -1;
//クリップボードを開く
ret = OpenClipboard(m_hOwnWnd);
//現在存在するデータタイプを取得する
format = 0;
for(;;){
//ビットマップを探す
format = EnumClipboardFormats(format);
if(format==CF_BITMAP){
img_flg = true;
break;
}
if(format==0)
break;
}
//イメージが無かった場合は終了
if(img_flg==false){
CloseClipboard();
return -1;
}
//クリップボードからビットマップのハンドルを取得
hBitmap = (HBITMAP)GetClipboardData(format);
//ロックする
GlobalLock(hBitmap);
//---------jpeg圧縮する-------------------------
// CLSIDの取得
...
// 品質指定
...
Bitmap gdiBmp(hBitmap, NULL);
LPSTREAM pstream = NULL;
if(gdiBmp.Save(pstream, &clsid, &encoderParams) != Gdiplus::Ok) //こ
こでエラー
goto EXIT;
STATSTG sts;
if(pstream->Stat(&sts, STATFLAG_DEFAULT) != S_OK){
ret = -1;
goto EXIT;
}
ULONG cbSize,pcbRead; //実際に読み込まれたバイト数
cbSize = sts.cbSize.LowPart; //highpartに値が入るよう
な大容量か確認
char *data = (char*)GlobalAlloc(GPTR, cbSize);
if(data == NULL){
ret = -1;
goto EXIT;
}
if(pstream->Read((void*)data, cbSize, &pcbRead) != S_OK){
ret = -1;
pstream->Release();
GlobalFree(data);
goto EXIT;
}
*image = data; //新しく割り当てられたポインタをセット
ret = (int)pcbRead;
//----------------------------------------------
EXIT:
//ロックを解放
GlobalUnlock(hBitmap);
//クリップボードを閉じる
CloseClipboard();
//jpegのサイズを返す
return ret;
}
> LPSTREAM pstream = NULL;
> if(gdiBmp.Save(pstream, &clsid, &encoderParams) != Gdiplus::Ok)
pstreamがNULLだからね。
CreateStreamOnHGlobalとか使ってStreamを作ってから、
そいつを渡してあげたらどうでしょう?