- PR -

ダブルバッファを使用しているコントロールで背景を透過させるには

投稿者投稿内容
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-09-13 17:42
れいさん。ご回答ありがとうございます。

引用:
あんまり複雑なリージョンを設定すると重くなり


使用できるキャンバスのサイズは最大256x256なので
テキストの長さも最大その程度ですし、長い文字で試したところ
リージョンの複雑さよりも、文字の大きさの方が速度に大きな影響を与えるようです。

引用:
文字を点線で囲んでさらにその点線をアニメーション化(@)し


引用:
@に関してどこか参考になるサイトとかありましたらご紹介下さい。



グラフィックソフトで文字列や任意の図形等を選択している時に周囲が点線で囲まれている状態に
なりますが、その実装方法("アニメーションする"ところよりむしろ"文字を点線で囲む")を
お聞きしたかったのですが。。。
調べたところエッジ検出アルゴリズムを応用してできそうですが、
通常どのような方法で行うものなのでしょうか?
なにぶん画像処理プログラミングは初めてなもので最適な方法があればご教授下さい。

宜しくお願いします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-13 17:52
引用:

Hideringさんの書き込み (2007-09-13 17:42) より:
リージョンの複雑さよりも、文字の大きさの方が速度に大きな影響を与えるようです。


大きさも複雑さのうちです。

引用:

調べたところエッジ検出アルゴリズムを応用してできそうですが、



??
理解力が少ないので、ますますわからなくなりました。
矩形で文字を囲むという話ではなかったですか?
なぜエッジ検出がいるのでしょう?
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-09-14 10:13
れいさん。ご回答ありがとうございます。

紛らわしい発言が続いて申し訳ありません。

市販のグラフィックソフトの場合、先にも挙げたとおり、
文字列や任意の図形が選択状態にある場合、文字列なら個々の文字の形に沿って
任意の図形ならその淵に沿ってアニメーションする点線で囲まれるものが
多いようですが、これには煩雑なロジックを実装する必要があると
感じたため、個々の文字の形に沿って囲むのではなく、便宜的に
文字列を単一の矩形で囲んで選択状態を表現しようと考えております。

しかしながら、標準的なインターフェース(個々の文字の形に沿って囲む方法)
の実装を考えてみる必要もあるため、その実装方法として
どのような標準的なアルゴリズムがあるか(若しくはないか)
をお聞きしたかったです。
(簡単で高速なロジックがあれば採用したいと思ってます。)
エッジ検出アルゴリズムはグラフィックスプログラミング通でない
私が調べたものなのでまったく関係ないかもしれません。

宜しくお願いします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-14 14:03
引用:

Hideringさんの書き込み (2007-09-14 10:13) より:
文字列や任意の図形が選択状態にある場合、文字列なら個々の文字の形に沿って
任意の図形ならその淵に沿ってアニメーションする点線で囲まれるものが
多いようですが、



やっと理解しました。
それはエッジ検出ではないですね。
図形や文字を選択する場合、エッジは既に検出されてるはずですから。

引用:

しかしながら、標準的なインターフェース(個々の文字の形に沿って囲む方法)
の実装を考えてみる必要もあるため、その実装方法として
どのような標準的なアルゴリズムがあるか(若しくはないか)



普通に境界を表すベクトル列を作り、DrawLineで描くだけですね。
PenのDashStyleを変えて描画して動かせばよいとおもいます。

境界を表すベクトル列は自分で作る必要があります。

FontならGraphicsPath.AddStringでいけるのではないでしょうか。
.Netでは作ったことないのでダメかもしれませんが。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-09-14 15:22
引用:

感じたため、個々の文字の形に沿って囲むのではなく、便宜的に
文字列を単一の矩形で囲んで選択状態を表現しようと考えております。



あれ?こっちの方が一般的じゃないですか?
最近はそうでもないのかな?
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-09-20 12:05
れいさん。渋木宏明(ひどり)さん。ご回答ありがとうございます。

引用:
普通に境界を表すベクトル列を作り、DrawLineで描くだけですね。
PenのDashStyleを変えて描画して動かせばよいとおもいます。

境界を表すベクトル列は自分で作る必要があります。

FontならGraphicsPath.AddStringでいけるのではないでしょうか。
.Netでは作ったことないのでダメかもしれませんが。



GraphicsPath.AddString
DrawPathで文字のアウトラインが描画できるようです。
ところが、
GraphicsPath.AddString、DrawPath(FillPath)で描画した文字列は
DrawStringで描画した文字列と形が異なることが分かりました。
GraphicsPath.AddString、FillPath
で描画した文字はDrawStringで描画したものと比べると
小さいサイズで特にいびつになってしまいます。
また、描画領域のサイズがMeasureStringで取得するサイズと違うようです。

小さいサイズでもきれいに描画される必要があるので
描画にはDrawStringを使用し、ベクトル列作成には
GraphicPath.AddStringを使用せずGraphicPathを自作すれば
DrawPathで文字のアウトラインを描画することで
やりたいことが実装できることがわかりました。
GraphicPath作成ロジックは少し考えてみて
この方法を採用するか否かを検討したいと思います。
ありがとうございました。

引用:
あれ?こっちの方が一般的じゃないですか?
最近はそうでもないのかな?



使用するソフトの仕様の話になるとおもうのですが、私の調べた限りでは、
"文字列を単一の矩形で囲んで選択状態を表現している"場合は、
確定後、矩形内かつ文字以外となる部分(文字の背景)は透過しません。
例えば、Windows付属のpaintがそうです。
私の場合は、文字のみを描画できるようにしたいので
"個々の文字の形に沿って囲む"方が正しいように思います。

スキルアップ/キャリアアップ(JOB@IT)