C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WPFで「抜き色」を指定するには。


(過去ログ 41 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■21268 / inTopicNo.1)  WPFで「抜き色」を指定するには。
  
□投稿者/ Z (23回)-(2008/06/29(Sun) 18:55:05)

分類:[C#] 

お世話になっています。
WPFで画像をいじっていて「アレ?」って思ったことがありまして・・・

GDI+を用いて背景画像の上にキャラクタ画像等をコピーする場合、
「MakeTransparent」
を用いて「抜き色」を指定するのが一般的だと思います。
(一般的にはDirectXじゃね?って話かもしれませんが・・・)

これをWPFでやってみようとしたのですが、うまいやり方が見つかりません。

画像Aの任意の位置に画像Bをコピーするというのが見つからず・・・
仕方なく「WriteableBitmap」を用いてピクセル情報の配列を
直接操作して、画像のコピーや抜き色処理、合成処理等を行い、
とりあえず、やってみたいことはできたのですが・・・

このようなやり方をしなくても、「このクラス使えば簡単にできるのに」
ってクラスが存在すると思うのですが・・・

上記のやり方では、WPFのウリの一つでもある「GPUで高速化」の恩恵も
無いですし・・・

そもそも、「背景の上にキャラクタを置いた画像を作ってそれを表示」
っていう考え方自体がWPFのやり方ではないのでしょうか。

有識者の方々、ご教授願えないでしょうか。よろしくお願いします。




引用返信 編集キー/
■21269 / inTopicNo.2)  Re[1]: WPFで「抜き色」を指定するには。
□投稿者/ 中博俊 (1312回)-(2008/06/29(Sun) 21:09:52)
中博俊 さんの Web サイト
WPFは全般32bitなので、特に抜き色ではなくαチャンネルで表現です。
引用返信 編集キー/
■21271 / inTopicNo.3)  Re[2]: WPFで「抜き色」を指定するには。
□投稿者/ Z (24回)-(2008/06/29(Sun) 23:27:40)
No21269 (中博俊 さん) に返信
> WPFは全般32bitなので、特に抜き色ではなくαチャンネルで表現です。

返信ありがとうございます。

それも試したのですが、どうも上手くいかないのです。

それ以前に「画像Aの任意の位置に画像Bをコピーした画像を作成する」
の時点で方法がわからず、WritableBitmapを用いてピクセル配列を直接操作という
やり方でやっており、結局自分でαチャンネルの値をみてピクセルをコピーするかどうかを
判別しているのですが・・・

ピクセル配列を直接操作しているので、
「モザイク処理だろうが、ドラクエの旅の扉みたいなのだろうが何でもできる」
の状態なのですが、「絶対にもっと簡単な方法あるよなぁ〜」って思っているところです。





引用返信 編集キー/
■21275 / inTopicNo.4)  Re[3]: WPFで「抜き色」を指定するには。
□投稿者/ 中博俊 (1313回)-(2008/06/30(Mon) 01:26:59)
中博俊 さんの Web サイト
そこまで画像合成やってないから踏み込んだ内容になると分からないw


引用返信 編集キー/
■21279 / inTopicNo.5)  Re[4]: WPFで「抜き色」を指定するには。
□投稿者/ Hongliang (279回)-(2008/06/30(Mon) 09:35:59)
DrawingVisual の RenderOpen で DrawingContext 取得して DrawImage して、
最終的に RenderTargetBitmap に Render するのが WPF での一般的な画像合成だと思いますが……。

GDI+ の GetPixel/SetPixel とか ColorMap みたいな事を WPF でどうやるんでしょうかね?
引用返信 編集キー/
■21286 / inTopicNo.6)  Re[5]: WPFで「抜き色」を指定するには。
□投稿者/ 渋木宏明(ひどり) (801回)-(2008/06/30(Mon) 11:17:39)
渋木宏明(ひどり) さんの Web サイト
> GDI+ の GetPixel/SetPixel とか ColorMap みたいな事を WPF でどうやるんでしょうかね?

積極的には支援しない方向性なんじゃないかな。

拡大・縮小に対応しづらいですよね?

引用返信 編集キー/
■21288 / inTopicNo.7)  Re[6]: WPFで「抜き色」を指定するには。
□投稿者/ Z (25回)-(2008/06/30(Mon) 11:57:15)
No21286 (渋木宏明(ひどり) さん) に返信

>DrawingVisual の RenderOpen で DrawingContext 取得して DrawImage して、
>最終的に RenderTargetBitmap に Render するのが WPF での一般的な画像合成だと思いますが……。
>GDI+ の GetPixel/SetPixel とか ColorMap みたいな事を WPF でどうやるんでしょうかね?

ありがとうございます。DrawingVisualを試してみます。


> 積極的には支援しない方向性なんじゃないかな。
>
> 拡大・縮小に対応しづらいですよね?

ちょっとトリッキーなことする場合、ピクセル配列を直接いじるのもアリかも
しれまねんね。少々面倒だけど何でも出来ますし。
パフォーマンスさえ問題なければ・・・

引用返信 編集キー/
■21295 / inTopicNo.8)  Re[7]: WPFで「抜き色」を指定するには。
□投稿者/ 渋木宏明(ひどり) (802回)-(2008/06/30(Mon) 13:25:50)
渋木宏明(ひどり) さんの Web サイト
> ちょっとトリッキーなことする場合、ピクセル配列を直接いじるのもアリかも
> しれまねんね。少々面倒だけど何でも出来ますし。

シナリオ次第です。

単純に「複数のビットマップを重ねた絵」を表示したいだけなら、抜きたいところに透明色にしたビットマップを適当なZオーダーで重ねてやればいいだけだし、画像処理的な効果を出したければフィルタで出来ます。

で、最終的な表示イメージを画像ファイルに書き出すのも数手間でできるので、ピクセル単位での操作が必要になる局面は Windows.Forms の時よりも少ないんじゃないかと。
引用返信 編集キー/
■21300 / inTopicNo.9)  Re[3]: WPFで「抜き色」を指定するには。
□投稿者/ NyaRuRu (46回)-(2008/06/30(Mon) 14:30:20)
2008/06/30(Mon) 14:56:37 編集(投稿者)
2008/06/30(Mon) 14:36:25 編集(投稿者)

No21271 (Z さん) に返信
> ■No21269 (中博俊 さん) に返信
>>WPFは全般32bitなので、特に抜き色ではなくαチャンネルで表現です。
>
> 返信ありがとうございます。
>
> それも試したのですが、どうも上手くいかないのです。

Direct3D をはじめとするリアルタイム 3D の世界では,10 年以上前からずっとカラーキー対アルファ値の対立があって,様々な理由により結局アルファ値方式が生き残りました.
というわけで,方法としてはこちらが正道です.がんばって原因を探してみて下さい.

Direct3D で以下のような議論が行われていたのが 10 年ぐらい昔です.
http://www.platz.or.jp/~moal/colorkey.html

> ピクセル配列を直接操作しているので、
> 「モザイク処理だろうが、ドラクエの旅の扉みたいなのだろうが何でもできる」
> の状態なのですが、「絶対にもっと簡単な方法あるよなぁ〜」って思っているところです。

中さんの言われるように,アルファ値付きの画像データを使用すれば問題なくできるはずの内容なので,そちらで調査してみて下さい.

なお,Direct3D をはじめとするリアルタイム 3D の世界では,CPU でピクセル配列を直接操作という方法と,プログラマブルシェーダによるカスタム処理の対立があって,様々な理由により棲み分けが進みました.
「モザイク処理」にしても,「ドラクエの旅の扉みたいなの」にしても,CPU によるオンメモリ処理と,GPU とシェーダ言語によるハードウェア処理それぞれが当たり前になっています.パフォーマンスが必要であれば GPU で実装しますし,移植性や汎用性が必要であれば CPU で実装します.
GPU でのエフェクト実現方法などは,ゲーム開発者向けのエフェクト解説書などが参考になるでしょう.
http://www.amazon.co.jp/dp/4797344962
http://www.amazon.co.jp/dp/4797332956

WPF でも,カスタムなシェーダが使用できるようになるので,今後はそういったアプローチが徐々に現れてくるかと思います.

(追記)
むかしの GDI / GDI+ / DirectDraw で行っていたような手法,つまり一枚のフレームバッファの内容を画像転送で次々に書き換えていくという描画スタイルそのものが,Direct3D をはじめとするリアルタイム 3D の世界では廃れてしまっています.
もちろん実際にはバックバッファといった概念は残ってはいますが,基本的にこれらのバッファは書き込み専用で読み出しができません.ハードウェアが非常に長大なパイプライン処理を行うようになったため,読み出しを許すととんでもないブロッキングが発生してしまうのです.ハードウェア進化のトレンドが,プログラミングスタイルそのものに影響を与えてしまったとお考え下さい.
引用返信 編集キー/
■21303 / inTopicNo.10)  Re[4]: WPFで「抜き色」を指定するには。
□投稿者/ Z (26回)-(2008/06/30(Mon) 14:54:33)
皆様、返信ありがとうございます。

教えていただいた内容を参考にし、
自分で色々と試してみます。

「トライ&エラー」
は自分の日常なんで(笑)

本件はとりあえず、解決済みとさせていただきます。

いろいろやってみて新たな疑問や方法があったら、
関連した内容で掲示板に書かせていただきますので、
その時はまた、よろしくお願いします。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -