ビットマップ画像回転について

解決


かかし  2010-03-03 03:23:19  No: 71454

お世話になります。

Visual Studio2005 C++ MFCにて
ピクチャボックスにビットマップ画像表示
を行っています。

そのなかで、PlgBlt()を使用して画像の回転を行なって
いるのですが指定したピクチャボックスに回転画像が
表示されません。
回転前の画像はピクチャボックスに表示され、回転画像は
ピクチャボックス外に表示されてしまいます。

御存知の方がおられましたらお教え頂けないでしょうか。

以下コードとなります。
int x=200,y=200,w=m_pBMIH->biWidth,h=m_pBMIH->biHeight;
POINT pt[3]={{x,y},{x+w,y},{x,y+h}};
POINT center={x+w/2,y+h/2};        
float rot = (float)3.1415 / 3
for(int i=0;i<3;i++) {
  pt[i].x -= center.x;
  pt[i].y -= center.y;
  //回転させる
  pt[i]=rotPoint(pt[i],rot);
  //元に戻す
  pt[i].x += center.x;
  pt[i].y += center.y;
  }

CDC *pDC1 = m_pict1.GetDC();
m_pict1.GetClientRect(&m_rect1);
pDC1->SetStretchBltMode(HALFTONE);
::StretchDIBits(pDC1->GetSafeHdc(),
0, 0, m_rect1.right, m_rect1.bottom,  // 転送先
0, 0, m_pBMIH->biWidth, m_pBMIH->biHeight,  // 転送元
m_pData, m_pBMI, DIB_RGB_COLORS, SRCCOPY);
//画像回転
CBitmap msk;
pDC1->PlgBlt(pt, pDC1, 0, 0, w, h,msk,0, 0);


仲澤@失業者  2010-03-03 03:45:14  No: 71455

PlgBlt()のマニュアルに
「サイズ変更、平行移動、反転を行うことはできますが、
回転や傾斜を行うことはできません」とありますが、
読みましたか。


subaru  2010-03-03 20:28:27  No: 71456

>PlgBlt()のマニュアルに
>「サイズ変更、平行移動、反転を行うことはできますが、
>回転や傾斜を行うことはできません」とありますが、
>読みましたか。

これはおそらく転送元のDCでSetWorldTransformされている場合の動作のことじゃないでしょうか。
(BitBltにも同様の解説があるので・・・)

回転、傾斜後の座標を自分で計算してやれば、
PlgBltで回転画像も傾斜した画像も表示することは可能です。


ryo  2010-03-03 21:05:58  No: 71457

MSDNの日本語訳が悪いようです

マスクの説明から続いていて、
「スケーリング、平行移動、反転は、(マスクの使用に)問題ないが、
回転、傾斜の場合はそうはいかない。
マスクがモノクロでないとエラーになる」

という意味のようです

で、本題の「違う場所に表示される」理由
>int x=200,y=200
これが原因(というか・・・どこからでてきたんだこの200は?)。
どっちも0にすればいい


仲澤@失業者  2010-03-03 21:37:39  No: 71458

おおっなるほど、これは大変失礼しましたm(__)m。


かかし  2010-03-05 20:52:32  No: 71459

お世話になります。

御指摘通り、
>>int x=200,y=200
>これが原因(というか・・・どこからでてきたんだこの200は?)。
>どっちも0にすればいい

int x=0,y=0でピクチャボック内に表示できました。

有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加