CBitmapのポインタしか無いときの縮小方法は – プログラミング – Home

CBitmapのポインタしか無いときの...
 
通知
すべてクリア

[解決済] CBitmapのポインタしか無いときの縮小方法は


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

こんにちは、いつもお世話になります

CBitmapのポインタしか無いときの縮小方法を教えて下さい。

パスをもらってJPEGオブジェクトを作成し、
JPEGオブジェクトからCBitmapのポインタを取得して
CBitmapのポインタを返す自作クラスを作成していて

縮小したCBitmapのポインタを返したいので StretchBlt と思うんですが
コピー元、コピー先のデバイスコンテキストの取得方法がわかりません。

作成しているクラスはCObjectの派生なので、
CClientDC(this)では取得できませんよね、どうなんでしょう

まだデバイスコンテキストのことが良く理解できていないので

環境:
WIN2000 SP2
VC6.0 SP5
MFC使用

よろしくお願いします


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

CClientDC dc(NULL);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
でメモリデバイスコンテキストを作成できます。

NULLを指定すると、
画面全体のデバイスコンテキストの取得になります。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

回答ありがとうございます

CClientDC CliDC(NULL)を利用して、
CJpegImage* pJpeg = pDoc->GetJPEGtoBMP(); // JPEGイメージ作成
CSize sImage;
sImage.cx = pJpeg->GetWidth(); // JPEGイメージ幅
sImage.cy = pJpeg->GetHeight(); // JPEGイメージ高さ

CClientDC CliDC(NULL);
CDC DestDC; DestDC.CreateCompatibleDC( &CliDC ); // 転送先DC
CDC SrcDC; SrcDC.CreateCompatibleDC( &CliDC ); // 転送元DC

CBitmap* pBitmap = pJpeg->MakeBitmap(); // ビットップ取得
CBitmap* pOldBitmap = SrcDC.SelectObject( pBitmap );
DestDC.StretchBlt( 0, 0, 128, 128, &SrcDC,
0, 0, sImage.cx, sImage.cy, SRCCOPY );
SrcDC.SelectObject( pOldBitmap );

を書いたんですが、
 1.DestDC(転送先)からCBitmapの取得方法がわからない。
 2.GetDC()の場合はReleseDC()をしますが上の場合はいるの?

再度、よろしくお願いします


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> 1.DestDC(転送先)からCBitmapの取得方法がわからない。

CBitmap::CreateCombatibleBitmap();
で新しいビットマップを作ります。
これを、DestDCにセットしたあとでDestDCに書き込みます。

> 2.GetDC()の場合はReleseDC()をしますが上の場合はいるの?

この場合、関数を抜けると各CDCはスコープ外となり破棄されます。
CDCのデストラクタはReleaseDC()を呼び出すので、必要ありません。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

何度もすみません
アドバイスを参考に ↓ のように変更しました
CJpegImage* pJpeg = pFrm->GetJPEGtoBMP(); // JPEGイメージ作成
CSize sImage;
sImage.cx = pJpeg->GetWidth(); // JPEGイメージ幅
sImage.cy = pJpeg->GetHeight(); // JPEGイメージ高さ

CClientDC CliDC(NULL);
CDC DestDC; DestDC.CreateCompatibleDC( &CliDC ); // 転送先DC
CDC SrcDC; SrcDC.CreateCompatibleDC( &CliDC ); // 転送元DC

CBitmap* pBitmap = pJpeg->MakeBitmap(); // 転送元Bitmap取得
CBitmap* pOldBitmap = SrcDC.SelectObject( pBitmap );
m_Bitmap.CreateCompatibleBitmap( &DestDC, 128, 128 ); // 転送先Bitmap作成

DestDC.StretchBlt( 0, 0, 128, 128, &SrcDC,
0, 0, sImage.cx, sImage.cy, SRCCOPY );
SrcDC.SelectObject( pOldBitmap );
this->Invalidate();

ここで作成した m_Bitmap を表示すると真っ黒になります
void CBItmapDlg::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

if( !m_Bitmap.GetSafeHandle() ) return;

CDC myDC; myDC.CreateCompatibleDC( &dc );
CBitmap* oldBMP = myDC.SelectObject(&m_Bitmap);
dc.BitBlt( 0, 0, 128, 128, &myDC, 0, 0, SRCCOPY);
myDC.SelectObject( oldBMP );
}
が表示部です(今は確認の為にダイアログでテストしています。)

で表示したいBitmapは24BBPのJPEGをBitmapしたものです。
縮小表示しないでそのままのときはきちんと表示されていました。

何故でしょうか?

再、再度、よろしくお願いします


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> m_Bitmap.CreateCompatibleBitmap( &DestDC, 128, 128 );

SDKのCreateCompatibleBitmapの説明に、指定するDCがメモリDBだと
カラーフォーマットが異なってしまう、とあります。
つまり、引数にはDestDCではなくその元となったCliDCを渡します。

そして、作ったビットマップをDestDCにセット(SelectObject)してから
書き込まなければなりません。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます
第一関門突破しました。

表示したいBitmapは24BBPのJPEGをBitmapしたものなので
表示されたBitmapが変な色です。

DDB DIBが関係していそうですが解決方法はありますか?

何度もすみませんがよろしくお願いします


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

いろいろありがとうございました。

最初の問題「CBitmapのポインタしか無いときの縮小方法は」
解決したので解決をつけます。

今も色が変に表示されるのですが最初の問題と違うので、
違うスレッドに書きます。

ありがとうございました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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