繁体   English   中英

在Delphi XE中删除TBitmap上的矩形

[英]Delete rectangle on TBitmap in Delphi XE

  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程序中所做的一样

您无法从光栅图像中删除内容。 每个像素必须有一个值。 您所能做的就是在已有的东西之上绘制其他东西。

因此,如果要还原以前的内容,则必须记住它的内容,然后重新绘制。

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

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

我假设您想绘制一个通常受鼠标移动约束的选择矩形 ,从而删除先前绘制的矩形,并在当前鼠标位置绘制一个新的矩形。 这可以通过在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;

简单的方法是使用TShape进行选择,完成选择TShape其隐藏并绘制形状
此TShape的坐标。

如果您将Delphi XEFireMonkey结合使用 ,则无需关心,只需使用TSelection组件即可显示区域,修改区域并从该区域获取信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM