CBitmapのポインタしか無いときの縮小方法は

[戻る]
ナオーバ 2002/07/31(水) 13:07:52
こんにちは、いつもお世話になります

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

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

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

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

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


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

よろしくお願いします

dairygoods 2002/07/31(水) 14:28:01
CClientDC dc(NULL);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
でメモリデバイスコンテキストを作成できます。

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

ナオーバ 2002/08/01(木) 10:15:17
回答ありがとうございます

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 2002/08/01(木) 10:35:58
> 1.DestDC(転送先)からCBitmapの取得方法がわからない。

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


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

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

ナオーバ 2002/08/01(木) 13:26:17
何度もすみません
アドバイスを参考に ↓ のように変更しました
    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 2002/08/01(木) 15:13:17
> m_Bitmap.CreateCompatibleBitmap( &DestDC, 128, 128 );

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

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

ナオーバ 2002/08/01(木) 15:59:13
ありがとうございます
第一関門突破しました。

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

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

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

ナオーバ 2002/08/02(金) 18:40:44
[[解決]]
いろいろありがとうございました。

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


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

ありがとうございました

古いスレッドには追加発言できません。