2012-01-22 8 views
2

私は画像処理にGraphics32を使用しています。その機能を見ると、クリッピングマスクが適切に実装されているかどうかはまだわかりません。私はここでそこにポップアップ "クリッピング"という言葉が表示されますが、それは別のものを参照しているようです。Graphics32を使用してクリッピングマスクを作成する

単純に言えば、別の層に「覗き穴」として機能するレイヤーが必要です。レイヤーAはレイヤーBに投影されるべきですが、レイヤーBのみが表示されます。 (私はクリッピングマスクが何であるかを再定義する必要はないと思う)

私が提示したいと思っている他のレイヤーのビットマップだけだったら、そうするのは難しいだろう。 this trickを使用してください。しかし、複雑なことは、レイヤのビットマップがレイヤによって表示されるものをあまり伝えていないことです。層であることができる:

  • (部分的に)不可視(場合ビューのうち)
  • +随意延伸/移動
  • をリサンプリングし、そのビットマップでない効果を

回転。

実際にはこのための準備ができていないのですか?これを自分自身で行うための提案はありますか?

進捗

私はGraphics32のソース内のいくつかの有用な要素を発見しました。たとえば、この宣言を使用:

type 
    TLayerAccess = class(TBitmapLayer); 

は、保護されたメソッドへのアクセスを得るために、私はまさにそれが画面に同じように、ビットマップに塗装だけで、この層を持っているTLayerAccess(ABitmapLayer).Paint(ABitmap32)を呼び出すことができます。

+0

graphics32は32ビットのビットマップを単独で使用し、ブレンドに使用されるビットマップのアルファチャンネルです。私はあなたが使用できる別のアルファフィールド(例えば、クリッピングエリアなど)を知らない。あなたは別の「マスターアルファ」しか持っていません。私は...するだろう。 1.アルファビットマップ(すべて白、アルファチャンネルはビットマップ座標のクリッピングパス)を決定し、元のビットマップにこのビットマップを掛けてビットマップをデスティネーションにレンダリングします。 –

+0

レイヤBのどの部分が表示されるかはどのように定義しますか? – iamjoosy

+0

@iamjoosyコンテナ(TImage32)に描かれているところで、どこで見ることができますか? –

答えて

0

TByteMapを見て、そののwriteToメソッドを持っています。

0

私は1年前に自分自身を見て、すぐに透明な部分を持つ黒い層を使用することに頼っていました。それは私のその後のニーズに適しています。しかし、あなたが望む可能..です

あなたはカップル1 TBitmapLayerに別のにしたいとそれにそのマスクを検討してください。しかし、私はこれらの参考文献(およびその潜在的な問題とGraphics32のリワーク)を避け、最後の手段としてのみこれを見たいと思います。

独自のピクセルコンバイナを使用して、専用TBitmapLayerなしで行う方法があります。しかし、TBitmapLayersとそのXYピクセルについてはわかりません。適切な閉塞する

(または除外)TBitmapLayerの部分画面に描きながら、あなたはtype TPixelCombineEventのメソッドを作成して使用し、そのOnPixelCombineとしてこれを割り当て、dmCustomTBitmapLayer.DrawModeを設定することができます。あなたはピクセルが背景Bと現在のMマスターアルファを与えフォアグラウンドF指定された結果かを決めることTPixelCombineEventメソッド内

procedure TMyObj.MyPixCombine(F: TColor32; var B: TColor32; M: TColor32); 
begin 
    if not PseudoThisPixelShouldBeMasked then B := F; // ugly and aliased 
end; 

ここでの問題は、PseudoThisPixelShouldBeMaskedが本当に何ピクセル、この懸念とそれがマスクの内側にあるかどうか分かりません(擬似コード)ということ、です。したがって、その値をFのコンポーネント(Alpha値など)から抽出する必要があります。

私は非常に速いのを選んだB := ColorMin(F,B);ここでFは黒または白です。このレイヤーは常に上にあり、透明マスクの代わりに黒色になります。 これはTBitmapLayerへのレンダリングがマスクデータを破壊するため、再適用する必要があるためです。しかし、iamjoosyの下で提案されているように(誰がそれを下降させたのか)、興味深いかもしれませんが、おそらくパフォーマンスペナルティは無視できるほどです。

関連する問題