電子書籍の厳選無料作品が豊富!

お世話になります

VC 2010 C++/CLIで作成されている、既存プロジェクトに以下のグラフィック機能を追加したいのですが、
色々試しては挫折してます。
実現可能なライブラリを教えていただけないでしょうか。

【補足】
・既存プロジェクトはそれなりに大きなものなので、既存部の書き換えは考えておりません
・既存プロジェクトはPictureBoxで出来る範囲の色々な描画を行っているので、ここはそのまま残す予定

【追加機能】※ 以下は新規に子フォームを作成して、独立した機能として追加予定
1. 異なるサイズの画像(写真)を重ねて描画する(これは、単純なので標準の機能を始め全てで出来ます。)
2. 上面の画像を半透明にして、背景の写真を透過
(上面画像の背景を透過するのではなく、上面画像の全体を透過)
3. 上面の画像をマウスに追従して移動
4. 上面の画像の4点を個別にマウス指定で変形
5. 1~4で出来上がった画像の合成&出力

【試したもの】(理解ミスが有るかもしれません)
※事前検討で実現困難なライブラリも小細工できないかと、念のためそれぞれ試しております。
1. 標準の機能
・アドバイスをいただき、透過はできたのですが、4の変形ができない
(画像データを変形毎に計算して求めるのは非現実的なので適用していません・・変形後も移動が有る為)

2. OpenCV
・透過処理がアルファブレンドなので、3の処理が遅い
(理想はOpenGLの様にZバッファを使用して、背景が透過するもの・・・背景を意識しない処理のみで済むもの)
・透過処理がアルファブレンドなので、同サイズの画像か背景を上面と重なる部分を検出して切り出す必要がある
(上面の画像の変形を考えると、背景を上面に合わせて切り出すのは困難)
・4が矩形しか対応していないので、ひし形までしか変形できない
(視点の変更で形状こそ求めているものに近くなるが、今回の用途ではユーザーに単純操作で変形させてあげる必要がある)

3.OpenGL
・画像単体での読み書きができない
(テクスチャマッピング機能を用いるか他のライブラリを併用する必要がある)
・平面ポリゴンを定義して、テクスチャマッピングをした場合、4の変形時にマッピング画像が追従するようにする必要がある

4.DXLib
・追加機能に対応する機能を持ってはいるが、そもそもCLIに対応していない

5.GDI+
・CLI対応のサンプルが見つからない?
(CLI以外のサンプルは多々見かけるのですが、ウインドウのハンドルやポインタの使い方が異なり、苦戦中)
・そもそも、説明しているサイトが少ない
(私のような素人がみるとどれがGDI+の記述でどれが標準の機能なのか判らないものばかり
 せめてGDI+のXXXを使用すると以下のソースになるみたいな説明がされているサイトがが有れば教えてください)

6.Direct2D
※まだ検証してません

A 回答 (4件)

こんにちは。


全てを網羅的に知っている訳ではないので、どれが良いかなどには答えられませんが、コメントを。

【1. 標準機能】

> 画像データを変形毎に計算して求めるのは非現実的なので

どの様なライブラリ・APIを使ったとしても、(プログラマーが意識しなくても) 内部的には変形された画像データを計算している事には変わりありません。従って、画像データを変形の度に計算する事自体に関しては非現実的とは思いません。ただ、実際的な問題として、コーディングの手間と計算時間があるかと思います。標準機能の範囲内で実現するとしたら、コーディングの手間は惜しまないとしても、計算時間が問題として残りそうではあります。

しかし、実測していないので usami99 さんの目的の計算で、どれくらいの時間になるかは分かりません。もしかすると無視できるぐらい時間が短いかもしれませんし、或いは非現実的に遅いかもしれません。ところで、計算時間を評価する上で以下の事は確認した方が良いです:

「変形対象の画像サイズが大きすぎないか?」
画像サイズが実際の表示に用いている物よりも大きい場合には、画像サイズを表示する大きさに縮小してから表示するべきです。計算時間は画像の面積(∝長さの二乗)に比例しますので。

因みに OpenCV, OpenGL, DXLib, (それから、もしその様な機能が在れば Direct2D も) では、GPU の機能を呼び出して変形を計算していると思われるので、愚直に計算するよりは格段に速いと予想されます。

この方法を採用する場合に考慮するべきは
★コーディングの手間
★計算時間の評価 (過大評価しているかもしれないので、効率的な実装にしてから、実測)

【2. OpenCV】
使った事がないので分かりません。ただ、
> (視点の変更で形状こそ求めているものに近くなるが、
という事であれば、「どの様に視点を変更すれば目的の形になるか」を計算すれば良いのではないでしょうか。三次元の幾何学の計算(数式変形)が必要になると思いますが。

> ・透過処理がアルファブレンドなので、同サイズの…
何をしているのか良く分かりませんが、例えば、↓にある様な事をしようとしているという事でしょうか。
http://www3.pf-x.net/~chopper/home2/WinAPI/WinGD …
それならば、上記URLに書いてあるように、変形した後の余白に対応するマスク画像を生成すれば良いのではないでしょうか。

★4点に対応する視点の計算方法が分かればする
★マスクは可能か?

【3. OpenGL】
余り使った事がないので分かりませんが…

> 4の変形時にマッピング画像が追従するようにする必要がある
勘違いしているかも知れませんが、テクスチャ(及びポリゴン上の UV 座標)はそのままで、平面ポリゴンの方を傾けるのでは駄目なのでしょうか。この場合も 4 点に対応するテクスチャの傾け方を考える必要がありますが。

★テクスチャの方を傾けるのは可能か?

【4. DXLib】
すみません分かりません。
DXLib は他の枠組と相互運用できない様に思われます。DXLib の上で UI を全て作り直すのであれば可能そうですが。

【5. GDI+】
他の方が回答されている様に C++/CLI との親和性は高いですが、4点を指定して画像を変形する機能は GDI+ にはないと思うのですが…(勘違いでしたら済みません)。

というのも、.NET Framework の System::Drawing は元々 Gdiplus のラッパーとして設計されているからです。従って、GDI+ と System::Drawing の親和性が高いのは、そもそも同一の物ですから当然です。そして、4点を指定して画像を変形する機能は GDI+ にないので、標準の機能 (.NET Framework System::Drawing) にもないのです。

> 同じ名称の物が有るたびに
> 一つ一つ、動作確認しながらクラスの定義をしなくてはならず、難儀しています。
> > 回答No.2 なにか言葉を湾曲して捉えられていませんか?
質問者さんは「System::Drawing::Graphics と Gdiplus::Graphics を混同している」とか「CLI からうまく使えない」とかいうのではなくて、例えば、「その辺りにある解説サイトに登場する Graphics オブジェクトが Systen::Drawing::Graphics の事なのか Gdiplus::Graphics の事なのか解説サイトに明記されていない(or分かりにくい)」事を嘆いていられるのですよね。お気持ち分かります。

★GDI+ は標準の機能とほぼ同等

【6. Direct2D】
これも知りませんが、Wikipedia によると GDI/GDI+ と相互運用できるとあるので、
System::Drawing::Graphics^ g の g->GetHdc() で得られる HDC に対して描画できるのではないでしょうか。
もしこれでできるのであれば、この方法が一番綺麗だと思われます。

サンプル (C++)
http://code.msdn.microsoft.com/windowsapps/Direc …

--------

4点を指定して変換するという事が今回の鍵になると思うのですが、その辺りの経緯を分かり易くする為にも、過去の関連する質問へのリンクがあった方が良いかもしれません。
http://oshiete.goo.ne.jp/qa/8696755.html
http://oshiete.goo.ne.jp/qa/8679117.html
http://oshiete.goo.ne.jp/qa/8662361.html
    • good
    • 0
この回答へのお礼

ありがとうございます

そうなんですよ、既に既知の部分でSystem::Drawing::Graphicsは多様しているので、
サンプルを見て、そんままGraphicsが流用できるかと思いきや、
サンプルはGdiplus::Graphicsだったり、
その逆で、あいまい表現のエラーを回避する為に態々Gdiplus::Graphics と明記すると
実はサンプルのGraphicsがSystem::Drawing::Graphicsだったり、
せめて、ヘッダもサンプルと一緒に公開してくれていれば、
System::Drawingのクラスが併用されているか判るんですけどね。

本日からDirect2Dもテスト的に組んでみますので、
g->GetHdc() を試してみます。

お礼日時:2014/08/04 09:32

> 1. 標準の機能


> (画像データを変形毎に計算して求めるのは非現実的なので適用していません・・変形後も移動が有る為)
既に指摘がありますし、私も既に回答しましたが、その処理は必ずしなければなりません。なので不可能な理由にはなりません。
パフォーマンス的な問題で質問者さんの目的が達せられない事があるかもしれませんが、それはこの検討段階で言えることではありません。

> 2. OpenCV
> ・透過処理がアルファブレンドなので、3の処理が遅い
> (理想はOpenGLの様にZバッファを使用して、背景が透過するもの・・・背景を意識しない処理のみで済むもの)
アルファブレンド以外にも合成方法はありますが、試しましたか?

> ・透過処理がアルファブレンドなので、同サイズの画像か背景を上面と重なる部分を検出して切り出す必要がある
> (上面の画像の変形を考えると、背景を上面に合わせて切り出すのは困難)
なぜ困難なのでしょうか?

> ・4が矩形しか対応していないので、ひし形までしか変形できない
> (視点の変更で形状こそ求めているものに近くなるが、今回の用途ではユーザーに単純操作で変形させてあげる必要がある)
方法があることは既に回答した通りです。

この回答への補足

ありがとうございます

> 方法があることは既に回答した通りです。
確かに、もう一つの質問の方で、方法がある事は回答いただきましたが、
肝心の方法を一つも明示していただけてないので・・・
(やればできる的精神論だと先に進まないので、お願いいたします)

すみませんが、解決策となる回答が有るのでしたら、
それを教えていただけないでしょうか?
もしくはCLIベースのサンプルを教えていただけないでしょうか?

補足日時:2014/08/04 10:05
    • good
    • 0

Gdiplus::はC++のクラスですが、GraphicsクラスはSystem.Drawing名前空間の.NETのクラスですのでC++/CLIでの利用に支障はないはずです。


なにか言葉を湾曲して捉えられていませんか?

「Graphics クラス (System.Drawing)」
http://msdn.microsoft.com/ja-jp/library/system.d …
    • good
    • 0

一番相性の良いのはGDI+だと思います。


「GDI+ によるグラフィカル イメージの作成」
http://msdn.microsoft.com/ja-jp/library/aa983623 …

Graphics オブジェクトの使い方を調べればよいだけだと思いますが。C#とかで例がないんでしょうか?

この回答への補足

回答ありがとうございます

私も、現段階でがDGI+かDirect2Dかなって考え始めたのですが

単純なC++やC#のサンプルは若干は有るのですが、
C++/CLIだとなかなか見つかりません

C++やC#のサンプルからC++/CLIにするのは、結構手間なんですよね。
慣れればいいのでしょうけど・・・

それと、既存部でSystem::Drawingを使用しているのですが
どのサンプルをみても
System::DrawingとGdiplus::のどちらのクラスを使用しているのかが明確になっていないため、
同じ名称の物が有るたびに
一つ一つ、動作確認しながらクラスの定義をしなくてはならず、難儀しています。

補足日時:2014/08/01 15:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!