- - PR -
ダブルバッファを使用しているコントロールで背景を透過させるには
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-13 17:42
れいさん。ご回答ありがとうございます。
使用できるキャンバスのサイズは最大256x256なので テキストの長さも最大その程度ですし、長い文字で試したところ リージョンの複雑さよりも、文字の大きさの方が速度に大きな影響を与えるようです。
グラフィックソフトで文字列や任意の図形等を選択している時に周囲が点線で囲まれている状態に なりますが、その実装方法("アニメーションする"ところよりむしろ"文字を点線で囲む")を お聞きしたかったのですが。。。 調べたところエッジ検出アルゴリズムを応用してできそうですが、 通常どのような方法で行うものなのでしょうか? なにぶん画像処理プログラミングは初めてなもので最適な方法があればご教授下さい。 宜しくお願いします。 | ||||||||||||
|
投稿日時: 2007-09-13 17:52
大きさも複雑さのうちです。
?? 理解力が少ないので、ますますわからなくなりました。 矩形で文字を囲むという話ではなかったですか? なぜエッジ検出がいるのでしょう? | ||||||||||||
|
投稿日時: 2007-09-14 10:13
れいさん。ご回答ありがとうございます。
紛らわしい発言が続いて申し訳ありません。 市販のグラフィックソフトの場合、先にも挙げたとおり、 文字列や任意の図形が選択状態にある場合、文字列なら個々の文字の形に沿って 任意の図形ならその淵に沿ってアニメーションする点線で囲まれるものが 多いようですが、これには煩雑なロジックを実装する必要があると 感じたため、個々の文字の形に沿って囲むのではなく、便宜的に 文字列を単一の矩形で囲んで選択状態を表現しようと考えております。 しかしながら、標準的なインターフェース(個々の文字の形に沿って囲む方法) の実装を考えてみる必要もあるため、その実装方法として どのような標準的なアルゴリズムがあるか(若しくはないか) をお聞きしたかったです。 (簡単で高速なロジックがあれば採用したいと思ってます。) エッジ検出アルゴリズムはグラフィックスプログラミング通でない 私が調べたものなのでまったく関係ないかもしれません。 宜しくお願いします。 | ||||||||||||
|
投稿日時: 2007-09-14 14:03
やっと理解しました。 それはエッジ検出ではないですね。 図形や文字を選択する場合、エッジは既に検出されてるはずですから。
普通に境界を表すベクトル列を作り、DrawLineで描くだけですね。 PenのDashStyleを変えて描画して動かせばよいとおもいます。 境界を表すベクトル列は自分で作る必要があります。 FontならGraphicsPath.AddStringでいけるのではないでしょうか。 .Netでは作ったことないのでダメかもしれませんが。 | ||||||||||||
|
投稿日時: 2007-09-14 15:22
あれ?こっちの方が一般的じゃないですか? 最近はそうでもないのかな? | ||||||||||||
|
投稿日時: 2007-09-20 12:05
れいさん。渋木宏明(ひどり)さん。ご回答ありがとうございます。
GraphicsPath.AddString DrawPathで文字のアウトラインが描画できるようです。 ところが、 GraphicsPath.AddString、DrawPath(FillPath)で描画した文字列は DrawStringで描画した文字列と形が異なることが分かりました。 GraphicsPath.AddString、FillPath で描画した文字はDrawStringで描画したものと比べると 小さいサイズで特にいびつになってしまいます。 また、描画領域のサイズがMeasureStringで取得するサイズと違うようです。 小さいサイズでもきれいに描画される必要があるので 描画にはDrawStringを使用し、ベクトル列作成には GraphicPath.AddStringを使用せずGraphicPathを自作すれば DrawPathで文字のアウトラインを描画することで やりたいことが実装できることがわかりました。 GraphicPath作成ロジックは少し考えてみて この方法を採用するか否かを検討したいと思います。 ありがとうございました。
使用するソフトの仕様の話になるとおもうのですが、私の調べた限りでは、 "文字列を単一の矩形で囲んで選択状態を表現している"場合は、 確定後、矩形内かつ文字以外となる部分(文字の背景)は透過しません。 例えば、Windows付属のpaintがそうです。 私の場合は、文字のみを描画できるようにしたいので "個々の文字の形に沿って囲む"方が正しいように思います。 |