2017-02-24 2 views
1

できるだけ効率的にTRectangleの背後のビットマップ領域をコピーしたいとします。これは、親コントロール内の赤い四角形からの境界線です。親バインドされた矩形のより効率的なコピー

bmp.CopyFromBitmap(FParentBitmap, BoundsRect, 0, 0); 
:私が欲しいの長方形をコピーするために、後に続い

(Parent as TControl).PaintTo(FParentBitmap.Canvas, 
      RectF(0, 0, ParentWidth, ParentHeight)); 

と:一時親TBitmapのに全体の親表面を取得

私は私のDelphi FireMonkeyのアプリでこれを持っています

もちろんこれは効率的ではありません。私は1パスで矩形をコピーしたい、あるいは少なくとも親全体をtemp TBitmapにペイントしたくない。

効率的な方法をご存知ですか?伝えてください。

TFrostGlassコンポーネントを作成しましたが、その中に完全なソースがあります。 https://github.com/Spelt/Frost-Glass

コピービットマップコードはである:FrostGlass.pas残念ながら

+0

imediatlyがbmp.canvasを与えなかった理由は何ですか? TmyControl.MakeScreenshot –

+0

ありがとうございます。私は質問を更新し、今はっきりと願っています。コントロールが赤い枠線のみをペイントするため、スクリーンショットには赤い枠線しか含まれていないため、MakeScreenShotは機能しません。 – Edward

+0

PaintToを負のオフセットで呼び出しますか?ターゲットキャンバスで(0、0)にペイントする代わりに、(-control.Left、-control.Top)にペイントします。 –

答えて

0

PaintToはコントロールの一部だけを描くことはできません。あなたはそれがこっちにダウンロード/参照することができます。しかし、@ Rob Kennedyが述べたように、オフセットを変更することで、ターゲットBitmapのどこでコンテンツが終了するかを制御することができます。

さらに、PaintToを呼び出す前にBeginSceneを呼び出すと、ClipRectsパラメータを設定できます。つまり、キャンバスのこの部分だけが更新されます。これは、ターゲットビットマップがBoundsRectより大きい場合に必要です。そうしないと、周囲の領域もペイントされるためです。

procedure PaintPartToBitmap(Control: TControl; SourceRect, TargetRect: TRect; Bitmap: TBitmap); 
    var ClipRects: TClipRects; 
     X, Y: Single; 
begin 
    ClipRects := [TRectF.Create(TargetRect)]; 
    if (Bitmap.Canvas.BeginScene(@ClipRects)) then 
    try 
     X := TargetRect.Left - SourceRect.Left; 
     Y := TargetRect.Top - SourceRect.Top; 
     Control.PaintTo(Bitmap.Canvas, RectF(X, Y, X + Control.Width, Y + Control.Height)); 
    finally 
     Bitmap.Canvas.EndScene; 
    end; 
end; 
+0

ClipRectsは多くのシェイプを行います。ほぼ50%のように。オフセットの修正がまだ正しく機能していません。 – Edward

+0

投稿したコードは、私が持っていたテストケースでうまく動作します。それがうまくいかない場合は、コードの一部を投稿する必要があります。そうでなければ、何がうまくいかないかを伝えるのは難しいでしょう。 – DNR

+0

私はそれを私がソースをオープンするぼかしコンポーネントプロジェクトで使用しています。私は次の週末に最初のベータ版がgithubに公開されることを期待しています。連絡します。 – Edward

関連する問題