2

画像処理にはGraphics32を使用しています。その機能を見ると、クリッピング マスクの適切な実装をまだ見ていないことに気がつきます。「クリッピング」という用語があちこちに出てきますが、それは別のことを指しているようです。

簡単に言えば、1 つのレイヤーが別のレイヤーへの「覗き穴」として機能する必要があります。レイヤー A はレイヤー B に投影する必要がありますが、レイヤー B が表示されている場合に限ります。(クリッピング マスクとは何かを再定義する必要はないと思います。)

提示したいのが他のレイヤーのビットマップだけである場合、それを行うのはそれほど難しくありません-このトリックを使用できます-しかし、物事を複雑にしているのは、レイヤーのビットマップが伝えないことですレイヤーによって表示される内容についての多く。レイヤーは次のいずれかです。

  • (部分的に) 見えない (見えないとき)
  • 移動/ストレッチ + オプションでリサンプリング
  • 回転した

ビットマップには影響しません。

実際には、これに対する準備が整った実装はありませんか? これを自分で行うための提案はありますか?

進捗

Graphics32 のソースでいくつかの有用な要素を見つけました。たとえば、次の宣言を使用します。

type
  TLayerAccess = class(TBitmapLayer);

保護されたメソッドにアクセスするTLayerAccess(ABitmapLayer).Paint(ABitmap32)には、画面に描画するのとまったく同じように、このレイヤーだけをビットマップに描画するように呼び出します。

4

2 に答える 2

0

TByteMapとそのwriteToメソッドを見てください。

于 2012-01-23T15:53:13.347 に答える
0

私は1年前にこれを自分で調べ、すぐに透明な部分を持つ黒いレイヤーを使用することに頼りました. それは私の当時のニーズに合っていました。しかし、あなたが望むことは可能です..

ある TBitmapLayer を別の TBitmapLayer に結合し、それをそのマスクと見なします。ただし、これらの参照 (およびその潜在的な問題と Graphics32 のリワーク) は避け、これは最後の手段としてのみ使用したいと考えています。

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

a while drawing to screen の一部を適切に隠す (または除外する) には、タイプTBitmapLayerのメソッドを作成し、これを に割り当ててに設定することができます。TPixelCombineEventOnPixelCombineTBitmapLayer.DrawModedmCustom

そのメソッド内で、現在のマスター アルファを指定して、背景と前景を指定しTPixelCombineEventてどのピクセルを生成するかを決定します。BFM

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

ここでの問題は、(疑似コード) PseudoThisPixelShouldBeMasked が、これが関係するピクセルと、それがマスク内にあるかどうかを本当に認識していないことです。Fそのため、アルファ値などのコンポーネントからその値を抽出する必要があります。

当時、私はB := ColorMin(F,B);Fが黒または白である非常に速いものを選びました. このレイヤーは常に一番上にあり、透明なマスクではなく黒になります。これは、へのレンダリングがTBitmapLayerマスク データを破壊し、再適用する必要があるためです。TByteMapただし、iamjoosy によって以下に提案されているように (誰が反対票を投じたのですか?) a を使用することは興味深いかもしれません。

于 2013-03-12T09:45:01.073 に答える