いつもお世話になっています、ddです。
StretchBlt(...)を使っています。
今回表示するのは台形の図面ですが、
StretchBlt(...)不向きなので、
どうしたらいいでしょうか。
(図面の4点座標を使えるの関数があるのでしょうか)
よろしくお願いします。
環境:.Net2002 Windows XP
質問は何ですか。資源の無駄なので
他人にわかるように質問してください。
説明が不足ですが、すみません。
台形の図面というのは、図面が長方形ではなく
台形の形です。
要するに、
普段は長方形の図面を表示するのはStretchBlt(...)で十分です。
一点の座標+図面の幅+図面の長さで表示できますが、
台形の図面の場合、4点の座標が必要になります。
下辺の幅と上辺の幅が一致していないことです。
今回の質問が
上記の図面が4点座標を使って表示用の関数が探しています。
あるいは、他の方法があるのでしょうか。
>他人にわかるように質問してください。
StretchBlt(...)のパラメータが見ればわかります。
よろしくお願いします。
ご希望のものはありません。
GDI では基本的に矩形(長方形)なので、その台形を含む長方形を StretchBlt してく
ださい。
良く分からないのですけれど、図面と言っているのは画像ファイルで
用意された物ですか?それともプログラム上でメモリDC等に描画したもの?
プログラムで画像を転送する場合、DC上にビットマップを選択して
転送先のDCに転送しますが、ビットマップは必ず矩形なので
転送関数も矩形で扱います。
ビットマップ上に載せた画像で意味がある部分が台形であっても
それは関係有りません。
従って意味が無い部分が転送先に影響を与えないように
マスク画像等を使って抜きを行うか、
透過色を設定して透過するかと言った事になると思います。
ですから、自分が扱っている画像が台形だからと言う考え方ではなく、
矩形の内の必要な部分を抜き出して転送するという考え方を
する必要があると思います。
もしくは転送先にリージョン等でマスクを掛けておくかなぁ。
画像転送関連でWEBを検索すれば、方法論は色々出てくると思います。
あと、見ればわかると言うのは掲示板での質問ではどうかと思います。
文字だけのやり取りになりますので基本的に書かれた事が全てです。
あと、同じ物を見ても同じ解釈をするとは限りませんし、
見方は人それぞれなので自分の解釈を提示しないと話が噛み合わない
なんて事にもなりかねません。
掲示板でやり取りする場合は、基本的には詳しすぎるかなと思うくらい
説明してちょうど良いケースが多いのでなるべく詳しく説明するように
した方が良いと思います。
あと、詳しく説明しようとすると自分の考えとか見方を見直す機会になるので
結果的に問題点がわかって解決に結びつくこともありますよ。
もしかして、こんなことがしたいんじゃないかと。
http://www.adobe.com/jp/support/kb/ts/224/ts_224567_ja-jp.html
「図面」が何であるのかさっぱりわからないので外すかもしれませんが。
まず、「図面」がビットマップであると仮定すると、全てのビットマップは
長方形であって、全て長方形として処理する以外に手段はありません。
次に、「図面」が個々の座標を持つ点の集まりであると仮定した場合、
好きに描画できるので、何の問題もありません。
最後に「図面」が「図形(シェイプ)」であり、変形操作に対応できる
「台形」のデータの持ち方を検討しているなら、4点座標でなく、
平行な2直線関数とその他の2直線関数を持つのが演算が簡単です。
しかし、2つの平行線が常にX軸に平行であるなら、台形を包含する
長方形とその長方形の端点でない2点を持つものでも十分といえます。
元の画像から、台形部分だけを切り出して表示したいのか
元の画像を、台形に変形させて表示したいのか
元の絵が台形データで、それを、表示用の台形サイズにして表示させたいのか?
(こうなると、元の絵がどういうデータかさっぱりわからんが)
まだまだ色々想像つくがさっぱりわからん
とりあえず
>上記の図面が4点座標を使って表示用の関数が探しています。
無い
皆さんの答えありがとう。
説明
1.図面=ラスターファイル、用意されたものです。
2.転送元が矩形であり、転送先が台形です。(描画の表示が台形です)
3.ファイル形式がTIFFです。
4.数十枚同じ台形画像を表示しています、画像同士が接合部分を一致しています。
(例:道路の線が繋がっています。)
5.図面の画像データが座標が持っています。
上辺の左右2点座標と下辺の左右2点座標があります、で、上辺の幅<下辺の幅。
確認
4 点座標を使って表示用の関数がない。
問題
>その台形を含む長方形を StretchBlt してください。
1.矩形で表示すると、上辺(幅小さい部分)伸びたんですが、
延びた部分が座標に合わないです。
どう解決するなのか。
よろしくお願いします。
ひょっとして、座標変換しつつ表示したいってことなのかな?
矩形の画像を台形に歪めて表示したい。
道路の線という例があるけれど、ちょうど、長方形の地図をバードビューで見たよう
な。
転送元が矩形で転送先が台形ならStretchBltじゃ無理ですね。
ただ、最初の質問の文書からこれを読み取れと言うのは無理ですね。
GDIにそういう変形を行なって画像を転送する関数はなかったような
気がします。私の知ってる範囲ではと言う話ですが。
知っている関数の範囲で何とかするとすると、
画素単位で座標変換して転送するくらいでしょうか。
めちゃくちゃ遅そうですけれど。
DirectXとかOpenGLにそういう転送をする関数があるかもと
思います。調べて見てはどうでしょう。
拡大、縮小、回転、平行移動、傾斜くらいなら SetWorldTransform でいけるんでしょう
けど、台形となるとわかりませんね。
# って、SetWorldTransform の使い方もよく知らないけど。
転送関数を自分でつくれば簡単ですね。
使ったこと無いけどOpenCVでそのようなことができないでしょうか。
http://opencv.jp/sample/sampling_and_geometricaltransforms.html
ここの「画像の透視投影変換 cvGetPerspectiveTransform + cvWarpPerspective」の
例がそれっぽいかなと思えますけど。