jpeg圧縮の出力先をメモリにするには – プログラミング – Home

jpeg圧縮の出力先をメモリにするには
 
通知
すべてクリア

jpeg圧縮の出力先をメモリにするには


よし
 よし
(@よし)
ゲスト
結合: 23年前
投稿: 23
Topic starter  

画面キャプチャした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;
}


引用解決済
トピックタグ
kure
 kure
(@kure)
ゲスト
結合: 19年前
投稿: 48
 

> LPSTREAM pstream = NULL;
> if(gdiBmp.Save(pstream, &clsid, &encoderParams) != Gdiplus::Ok)

pstreamがNULLだからね。
CreateStreamOnHGlobalとか使ってStreamを作ってから、
そいつを渡してあげたらどうでしょう?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました