2013-04-04 57 views
2
bmp := TBitmap.Create; 
    bmp.SetSize(Screen.Width,Screen.Height); 

    bmp.canvas.Brush.Style := bsClear; 
    bmp.Canvas.Pen.Color := clLime; 
    bmp.Canvas.Rectangle(startPos.X,startPos.Y,stopPos.X,stopPos.Y); <-draw rectangle 

是否有一種簡單的方法可以在不刷新整個圖像的情況下刪除舊矩形?在Delphi中的TBitmap上刪除矩形XE

我想選擇這個圖像的區域,就像他們在GRAFIC程序

回答

0

做您不能從光柵圖像中刪除的東西。每個像素都必須有一個值。你所能做的就是在已經存在的東西上繪製別的東西。

所以,如果你想恢復之前有什麼,你必須記住它是什麼,然後再畫一遍。

繪圖程序保持圖層,並將這些圖層合併爲單個圖像進行渲染。你也可以這樣做,但你必須用多個位圖自己來做,每層一個。

如果你想繪製一個選擇矩形,你不需要在底層位圖上繪製。當您需要繪畫時,將位圖繪製到屏幕上,然後在頂部繪製矩形。這樣你就不會讓選擇的矩形破壞實際的圖像。

+0

是的,這是現代的做法。但是當然也可以使用一些內射變換,例如對合。 – 2013-04-04 18:10:13

+0

@andreas我不明白你的意思 – 2013-04-04 20:05:36

+0

我同意最好按照你描述的方式去做。但多年前,這可能有點沉重。 – 2013-04-04 20:10:30

0

我假設你想畫一個選擇矩形通常由鼠標移動的約束,從而刪除以前繪製的矩形和繪製在當前鼠標位置一個新的。這可以通過在XOR模式筆繪圖來完成:

function NegativeColor(AColor: TColor): TColor; 
begin 
    Result := RGB(255 - GetRValue(AColor), 255 - GetGValue(AColor), 
    255 - GetBValue(AColor)); 
end; 

procedure TForm1.Button14Click(Sender: TObject); 
var 
    Bmp: TBitmap; 
begin 
    Bmp := TBitmap.Create; 
    try 
    Bmp.SetSize(100, 100); 
    Bmp.Canvas.Brush.Style := bsClear; 
    Bmp.Canvas.Pen.Color := NegativeColor(clLime); 
    Bmp.Canvas.Pen.Mode := pmXor; 
    Bmp.Canvas.Rectangle(10, 10, 50, 50); 
    Canvas.Draw(0, 0, Bmp); 
    Bmp.Canvas.Rectangle(10, 10, 50, 50); // "Erase" previous rectangle 
    Bmp.Canvas.Rectangle(10, 10, 90, 90); // Draw new rectangle 
    Canvas.Draw(0, 100, Bmp); 
    finally 
    Bmp.Free; 
    end; 
end; 
+0

當顏色通道的值爲$ 80時,將失敗。我看到沒有必要使用像這樣的破壞性方法。它也可能導致奇怪的顏色看起來很奇怪的長方形。 – 2013-04-04 21:13:16

0

簡單的方法是用TShape工作選擇,並做了選擇隱藏它時,並
畫形這個T形的座標。

0

如果您正在使用德爾福XEFireMonkey,你不需要去關心它,只需要使用一個TSelection組件,讓你展現一個區域,修改,並從區域信息。 ..