StretchBltについて – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] StretchBltについて

固定ページ 2 / 2

dd
 dd
(@dd)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

みなさんのご回答ありがとう。

確認したところ、完全台形ではないです、
変形が妥当だと思います、すみませんでした。
(上辺と下辺が平行ではないです。)
外形は矩形から矩形へ、
表示の内容が台形から変形へ。

やっぱり、アフィン変換になりますが。

>拡大、縮小、回転、平行移動、傾斜くらいなら SetWorldTransform でいけるんでしょう
見てみます。

>転送関数を自分でつくれば簡単ですね。
具体的のこと?

>使ったこと無いけどOpenCVでそのようなことができないでしょうか。
今は、MFC上でやっていますけど、
簡単に取り込みできるのでしょうか。(OpenCVをやったことがない)

よろしくお願いします。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

アフィン変換ほど簡単ではありませんね。
SDK/MFCのみでやるには、矩形から任意の四角形への変形関数を定義、
元画像のラスターのYに沿ってX方向に変形関数と、補間方法を適用して
転送先のビットカラーを演算し、転送先のDIBセクションのビットに代入
といった手続きになります。大変重い処理(Big Job)です。
一般に画像処理専用アプリ以外では必要のない処理ですので
設計の対象としているアプリケーションが、それらと関係ない場合は
「ビットマップの自由変形が必要となる」その仕様自体を
検討しなおしたほうが良いかもしれません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

大変重い処理と言う部分に関しては同感です。

単純にアフィン変換を行っただけだと実際にはうまく行かないです。
例えばですが、縮小されるような方向の変換だと元の画像では
別々の画素である物が同じ場所にマッピングされるケースがありえます。
この場合、どのようにして転送先の画素を設定すれば、
元の画像が変形されたように見えるのかと言う問題があります。
単純に上書きをしているだけだと後勝ちになるので、望んだ画像になるとは
限りませんよね。

こういった画像処理に関しては単純に考えて処理を行っても
処理自体が重い、思ったような結果が得られないと言った状況に
なる事が多いと思います。画像処理のノウハウを既に持っている
技術者であればともかく、勉強しながらやっている状況だと
なかなか自分が望んだ結果を得るのは難しいでしょう。
それを実現できる画像処理ライブラリを使用する事で解決できれば
良いと思いますが、解決自体が困難であれば、
仕様自体を検討しなおした方が良いかもしれないと言う仲澤@失業者さんの
意見はごもっともだと思います。


返信引用
おんどり
 おんどり
(@おんどり)
ゲスト
結合: 15年前
投稿: 5
 

>>転送関数を自分でつくれば簡単ですね。
>具体的のこと?

ライブラリを使用することばかり考えずに、自分で画像転送処理を実装して
みてはいかがでしょう、という意味で書きましたが伝わらなかったようです。

今、手に入る本でしたら
[詳解]画像処理プログラミング SoftBank Creative
[改訂版]ディジタル画像処理の基礎と応用 CQ出版
などを参考にするのがお勧めです。

画像縮小アルゴリズムを一つ実装するだけでも結構楽しめます。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

> 画像縮小アルゴリズムを一つ実装するだけでも結構楽しめます。

御本人次第と言うところですね。
取り組む題材としては面白いと思います。
後はやる気と時間が取れるかという所でしょうか。


返信引用
dd
 dd
(@dd)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

みなさんのご回答ありがとう。

>「ビットマップの自由変形が必要となる」その仕様自体を
>検討しなおしたほうが良いかもしれません。

>仕様自体を検討しなおした方が良いかもしれないと言う仲澤@失業者さんの
>意見はごもっともだと思います。

そうですね、アフィン変換が簡単ではありません。
これから、アフィン変換が専用のソフトを使って変換してもらいます。
変換後のラスタデータを貼り付けます。
その余白部分を隠して表示します。

>従って意味が無い部分が転送先に影響を与えないように
>マスク画像等を使って抜きを行うか、
>透過色を設定して透過するかと言った事になると思います。

これから、この技法をやってみます。(やったことがない)

>[詳解]画像処理プログラミング SoftBank Creative
>[改訂版]ディジタル画像処理の基礎と応用 CQ出版
>などを参考にするのがお勧めです。
今度休みの日、見てみます。
ありがとうございます。

皆さん、いろいろ教えていただく、ありがとうございました。


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

アフィン変換はPlgBltを使えば簡単にできます。
元の図が長方形だとすると変換後は平行四辺形になります。
例)
 元の図上のどのような平行線も変換後は平行のままです
 元の図の上辺近くの部分と下辺近くの部分も同じ変形をうけます

ddさんが望むのがこのようなものであり、
変換先を台形にクリップしたいだけならば、
変換先のhdcにSelectClipRgnなどを使えばできます。

そうではなく、長方形の図を斜め下から見たような、
つまり、下辺に比べ、上辺が圧縮されたような変形を望むのでしたら、
これは、アフィン変換ではありません。
DirectXなど、3Dライブラリでやるのが簡単だと思います。


返信引用
dd
 dd
(@dd)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

ロマ さん
ご回答ありがとう。

>アフィン変換はPlgBltを使えば簡単にできます。
>元の図が長方形だとすると変換後は平行四辺形になります。
元図面が上下辺が平行していますが、変換後平行ではないです。

>DirectXなど、3Dライブラリでやるのが簡単だと思います。
適当なサンプルがありますか、
興味があります。(やったことがありません)

よろしくお願いします。


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

お力になれず、申し訳ありません。


返信引用
dd
 dd
(@dd)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

いろいろ案がありますが、
1.画像転送処理
2.OpenCV 
3.DirectXなど、3Dライブラリ
>下辺に比べ、上辺が圧縮されたような変形を望むのでしたら、
そうではないです、やっぱり、DirectXが無理でしょうね
4.OpenGL

いずれも時間がかかりそうですが、
検討してからやってみます。

皆さんご回答ありがとうございました。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

今さらですが、
DIBを使えば比較的簡単にできそうな気がします。

DIBについては、こちらが詳しいです。
http://eternalwindows.jp/graphics/bitmap/bitmap00.html
要は、DIBを使うと画像をドット配列として扱うことができるのです。

その上でこちらを参照してください。
http://homepage2.nifty.com/tsugu/sotuken/rotation/
これは画像回転の例ですが、
[回転処理の基本]に書かれているように、出力画像の座標から入力画像の座標を
計算してやれば、回転に限らず、拡大縮小も自由自在です。
台形画像なら、上と下で拡大率(縮小率)が違うだけのことです。

拡大率(縮小率)によっては、出力画像の座標と入力画像の座標が1対1になりま
せんのでエッジが目立ったり、不自然な色になったりします。
それを補正するのが、ホームページに書かれている線形補間です。

ホームページには高速化手順も書かれていますが、
回転変形と違って、台形変形なら、処理速度は大して問題にならないはずなので
とにかくチャレンジしてみてはどうでしょう。


返信引用
dd
 dd
(@dd)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

bunさん
情報ありがとう。
これから、画像転送の処理をやってみます。

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


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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