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

有没有一种简单的方法可以在不刷新整个图像的情况下删除旧矩形?

我想选择这个图像的一个区域,就像他们在 grafic 程序中所做的那样

4

4 回答 4

0

简单的方法是使用TShape选择,完成选择后隐藏它并通过
此 TShape 的坐标绘制形状。

于 2013-04-06T21:37:51.647 回答
0

您不能从光栅图像中删除内容。每个像素都必须有一个值。你所能做的就是在已经存在的东西上画一些别的东西。

所以如果你想恢复以前的东西,你必须记住它是什么,然后重新绘制它。

绘图程序维护图层,并将这些图层合并为单个图像以进行渲染。您也可以这样做,但您必须自己使用多个位图,每层一个。

如果要绘制选择矩形,则无需在底层位图上绘制。当您需要绘制时,将位图绘制到屏幕上,然后在顶部绘制矩形。这样你就不会让选择矩形破坏实际图像。

于 2013-04-04T18:08:49.530 回答
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;
于 2013-04-04T20:56:05.590 回答
0

如果你使用Delphi XEFireMonkey,你不需要关心它,只需使用一个TSelection组件,它允许你显示一个区域,修改并从该区域获取信息......

于 2016-09-29T13:47:10.367 回答