delphi - 如何在位图上渲染棋盘网格?

标签 delphi delphi-xe

我正在另一个“下方”图像之上显示透明图像。

在本例中,底部(实心)图像是棋盘网格,顶部图像是狮子(透明):

enter image description here

enter image description here =enter image description here

原因是为了更好地显示透明区域,因为通常您看不到哪些区域是透明的。

问题是,位图的尺寸可以是任意大小,因此网格也需要与位图具有相同的大小。

如果您愿意,一种肮脏的方法是创建上面的棋盘网格的较大版本,其大小例如 2000x2000,然后根据您正在使用的位图的大小,您可以调整网格 Canvas 的大小以匹配。这并不理想,因为这意味着将大型棋盘网格位图与您的应用程序一起存储,然后意味着调整它的大小,这可能不会根据宽高比等给出正确的结果。

我认为正确的方法是以编程方式渲染棋盘网格,例如:

procedure RenderGrid(Source: TBitmap; Height, Width: Integer;
  Size: Integer; Color1, Color2: TColor);
begin

end;

这将允许自定义具有不同大小和颜色的网格,而不必担心存储大型棋盘网格位图并必须调整其大小的开销。

但是我不确定如何将网格绘制到位图上?我的一个想法是,您需要循环遍历位图的每个交替行并以这种方式为其着色?我不确定。

这涉及到我不擅长的数学和计算。如果您能启发我在位图上渲染网格的最有效方法,我将不胜感激。

最佳答案

procedure RenderGrid(Source: TBitmap; Height, Width: Integer;
  Size: Integer; Color1, Color2: TColor);
var
  y: Integer;
  x: Integer;
begin
  Source.SetSize(Width, Height);
  for y := 0 to Height div Size do
    for x := 0 to Width div Size do
    begin
      if Odd(x) xor Odd(y) then
        Source.Canvas.Brush.Color := Color1
      else
        Source.Canvas.Brush.Color := Color2;
      Source.Canvas.FillRect(Rect(x*Size, y*Size, (x+1)*Size, (y+1)*Size));
    end;
end;

关于delphi - 如何在位图上渲染棋盘网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529878/

相关文章:

delphi - 使用delphi从PID获取完整路径

delphi - 调用 ShowMessage 时会发生什么?

delphi - 在过程中传递不同的记录类型作为参数?

delphi - Delphi 泛型集合会覆盖 equals 吗?

delphi - 使用delphi 2010替换UTF-8文件中的unicode字符

Delphi XE TBytes正确用法

Delphi列表框拖放多个项目

delphi - 标准用户(XP/Server 2003及以下)如何获取所有正在运行的进程的镜像路径?

c# - 傻瓜式表单设计器

delphi - 以字符串格式存储日期值的最佳方法是什么?