初めて質問させていただきます。
背景画像の上で、別の画像を透過し 変動する角度に合わせて
回転させるというプログラムを作りたいのですが、
完全にVC++は素人なのでどこから攻めればいいのかわかりません;
一応今はwin2000下 2003.NET ダイアログベースで作成中です。
画像はPicturControlにCStatic::SetBitmapで表示しているんですが、
これだと表示する座標を指定したりCDC::TransparentBltを使えない・・・?
回転も、原理はわかるのですがそれをVC++でどう書けばいいのかわかりません;
やはりDirectXを使わなければいけないのでしょうか?
わかり難くて曖昧な質問で本当にすみません。
方向性を示して頂けるだけでも構いませんので、どうか宜しくお願いします。
GDI+を使うと、比較的簡単に回転描画できます。
http://www.microsoft.com/japan/msdn/library/ja/cpqstart/html/cpsmpnetsamples-
windowsformsgdi.asp
標準のGDIの関数を呼ぶだけで回転させるというのは無理だったと思います。
CDC::TransparentBltも透過処理と出力先の長方形に合わせて変形させるというだけで
回転は出来なかったはずです。
GDIで回転やろうとしてえらい苦労した挙句、ちっともきれいに回転できないわ、
描画めちゃくちゃ重くなるわでへこんだ記憶があります。
最も純粋にGDIを使ったわけじゃなくてCreateDIBSectionやら使ってBitmap上で
直接アドレス計算して画素転送したりしたんですけれども。
おそらく、dairygoodsさんが言われているようにGDI+を使うのが一番楽に出来ると
思います。まあ、スピード云々を言うのであればDirectXなのかもしれませんけれど。
dairygoodsさん、PATIOさん、ありがとうございました!
GDI+のサンプルがC#とVBばかりだったので、
てっきりVC++では使えないものだと思い込んでました;
早速GDI+について調べてみようと思います。
自分で書く・・というのは、なしですか?
バイリニア法ぐらいなら、すぐですが・・
バイリニア法やバイキュービックなどメジャーなものなら
ライブラリとして落ちているかもしれません。
GDI+、最初使い方がわからず時間がかかってしまいましたが、
割と簡単に画像を回転させることができました。ありがとうございます!
ですが、今の方法はダイアログに書きいているようで、
背景画像を表示させると隠れてしまいます;
GDI+でPictureControlに描画するにはどのようにすればいいのでしょうか?
追加質問で申し訳ありませんが、宜しくお願いします。
>reshiaさん
バイリニア法やバイキュービック、調べてみました。
画像補間のためのもののようですが、どう活用すればいいのか想像もできません;
自分で書く、というとLineToとかそういうのしか浮かばないです;
似たような処理を違う画像で複数行うつもりなので、
やはり楽なのはGDI+かな、と考えています。
#一応、補足しておきますと
拡大縮小もそうなのですが、
回転させるとき、オリジナル画像の画素との対応をとっていきます。
たとえば、時計回りに90度回転する場合、左上の画素が右上にうつりますよね。
逆を言えば、右上の画素はオリジナル画像の左上の画素から移ったということです。
こうやって、回転後の画像の画素1つ1つが、
オリジナル画像のどの画素に対応するかを求めていきます。
しかし、30度などの半端な回転の場合、対応する画素がない場合があります。
これを補うために画像補間が行われます。
>自分で書く・・というのは、なしですか?
これは、「BMP画像のデータを渡されたら回転した画像のデータを返す、」
というような関数を書いてはどうですか?
という意味でした。
BMPの表示自体は、現状のままで済みます。
もし、この方法でやられるのでしたら、
最初は、最近傍法(ニアレストネイバー)がお勧めです。
余談でした。
> 最初は、最近傍法(ニアレストネイバー)がお勧めです。
> 余談でした。
もし自力で回転アルゴリズムを書くのであれば、まず最初は基礎理解のために、
画素が抜けまくりになっても単純な方法からやるべきではないかと。
画像のビットひとつづつ回転させた先の座標に表示していく、
みたいな感じでしょうか?
画像の回転は透過GIFアイコンで試してみたんですが
半端な角度だとぼかしたような状態で表示されます。
これは自動で画像補間されているんでしょうか。
自分で補間できるのは面白そうですね。
余裕が出来たら調べてみようと思います。
ありがとうございました!