【问题标题】:Timage Transparencies on laptops in Delphi 7Delphi 7 笔记本电脑上的 Timage 透明胶片
【发布时间】:2010-07-16 09:32:09
【问题描述】:

我想做什么

我正在尝试将多个图形绘制到 Timage,我绘制的这些图形由带有 Foodfill 和线条的有序层组成。 我使用多个缓冲区来确保排序和双缓冲。

我在做什么

    procedure DrawScene();
var
  ObjLength,LineLength,Filllength,Obj,lin,angle,i:integer;
  Npoints : array[0..1] of Tpoint;
  Objmap:TBitmap;
  wholemap:TBitmap;

begin
  wholemap := TBitmap.Create;
  wholemap.Width:=area;
  wholemap.height:=area;

  ObjLength:=length(Objects);
  for Obj:=0 to (ObjLength-1) do
  if objects[Obj].Visible then
  begin
    // create object bitmap

    if Objects[obj].Tag='FBOX' then
      begin

      Objmap := TBitmap.Create;
      Objmap.Width:=area;
      Objmap.height:=area;
      Objmap.Transparent:=true;

      Objmap.Canvas.Rectangle((objects[obj].Boundleft-4)+objects[obj].Position.x,area-((objects[obj].boundtop+4)+objects[obj].Position.y),(objects[obj].boundright+4)+objects[obj].Position.x,area-((objects[obj].boundbottom-4)+objects[obj].Position.y));
      end;
    //draw object
    LineLength:=length(objects[Obj].Lines)-1;
    angle:=objects[Obj].Rotation;
    for lin:=0 to (LineLength) do
    begin
      for i:=0 to 1 do
      begin
        Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),objects[obj].Position,false);
      end;
      Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap);
    end;


    Filllength:=length(objects[Obj].Fills)-1;
    for i:=0 to Filllength do
      begin
        Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),objects[Obj].Position,false);
        Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
      end;

      //write object to step frame
      wholemap.Canvas.Draw(0,0,Objmap);
      Objmap.Free;


  end;
   // write step frame to Visible Canvas
   mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
   mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;


   wholemap.Free;

end;

我的期望

我希望看到每个图像对象相互叠加,每个图像层都是该层的完整图像。 我的例子是一个机器人,后面有一面旗帜。 先画旗帜,再画机器人。

我得到了什么(在电脑上)

在电脑上,我得到了我所期望的,一切似乎都是正确的。

我得到了什么(在笔记本电脑上)

在几乎每台笔记本电脑和一些个人电脑上,我只看到机器人。 我加入了一些陈述,看看它是否正在绘制标志,并且确实如此。游戏甚至可以以正确的方式与旗帜互动。 进一步的调查表明,它只显示了我的“drawscene”绘制的最后一张图像,并且当图像被直接绘制到整个画布上时,一切都出现了(由于填充层重叠的原因,这不能完成)

我认为正在发生的事情

所以我推断 Timage 的 Timage.transparent 属性不起作用或在某些机器上的计算方式不同..

我做了一个测试来证明这一点,并将画布变成红色。然后到那个画布,我在 0,0 i Timage 处绘制,属性为 transparent=true,红色画布中间只有一个点。结果是一张中间有一个点的白色画布。

我假设并且发现表明具有非常基本图形驱动程序的机器似乎将 null 或透明视为白色,而更强大的机器似乎将 null 或透明视为透明。

这似乎有点失败,因为 Timage.Transparent 属性为真。

编辑: 更新!!! 似乎在 ATI 显卡上,如果颜色为“null”,那么它会以 PF24bit 格式解释,因此没有 alpha 通道,也没有透明度。

在 Nvidia 卡上,它将其视为 PF32bit 并将 null 视为透明。

解决这个问题的明显方法是将位图类型设置为 PF32bit,但这仍然不起作用。 然后我假设这可能还不够,我应该确保背景设置为透明而不是保留为空..但是 Timage 内部没有工具(我可以看到)来设置带有 alpha 的颜色。所有画布绘图功能都需要一个 RGB 24 位的 Tcolor,而只有一个 RGBA 32 位的 TcolorRef 才可以...... 有没有用 alpha 0 绘制的方法?

我认为我需要知道什么

如何强制透明属性在所有机器上工作 或一种使笔记本电脑不粘贴为白色透明的方法 或者一种达到相同结果的方法。

任何人有任何解决方案或想法?

【问题讨论】:

  • 笔记本电脑还是个人电脑不应该是相关的,但屏幕分辨率,尤其是颜色深度可能是相关的。你能检查一下这些东西吗,至少在两台机器上,一台可以运行,一台不能运行?
  • 另一个可能的问题:您的笔记本电脑的屏幕可能无法显示您的颜色(例如:所有颜色的阴影都非常浅)并且在您看来“透明度”的东西不起作用,而事实上它正在工作,但你没有看到它。大多数投影仪都会发生同样的事情。如何测试:在 PC 上打印您的应用程序,保存到位图,将位图复制到笔记本电脑。或者反过来,在笔记本电脑上打印屏幕并在 PC 上查看位图。

标签: delphi graphics drawing transparency timage


【解决方案1】:

我一直在使用图形库 (AggPas) 来帮助绘制图形,而我注意到的一件事是我总是需要一行 Bitmap.PixelFormat = pf32bit 来让它绘制透明度。

话虽如此,我使用 AggPas 库中的 TransformImage 将具有透明背景的图像复制到另一个图像,而 AggPas 仅接受 pf24bit 或 pf32bits 作为像素格式(否则它不会附加到位图)

【讨论】:

    【解决方案2】:

    过去(几年前)我曾在不同的机器上看到过类似的行为。

    它们是由不同的显卡和驱动程序引起的。 NVideo 或 ATI 得到了错误的结果,但我忘记了。

    它可以在笔记本电脑和普通 PC 上复制。

    那么:您使用什么显卡和驱动程序?

    --杰罗恩

    【讨论】:

    • 这似乎是问题所在,经调查,某些颜色深度与工作机器相同的机器无法工作,并且无法显示的颜色包括白底黑字。但是当我查看视频驱动程序时,我发现所有工作的机器都有 Nvidia 驱动程序/卡和所有没有 ATI 的机器。有什么办法可以让我工作吗?
    • @Arthur:当时,我没有找到解决方案让它发挥作用。但是后来客户离开了基于 ATI 的机器,所以问题自己解决了。
    【解决方案3】:

    我会为您创建的每个位图明确地将位图格式设置为 pf32bit,以确保问题不会将颜色从 32 位转换为 16 位(如果这是创建位图的本机视频分辨率),这可能会干扰透明度作品。另外,我过去专门设置透明颜色的运气更好。

    另一种选择——从长远来看可能更好,是在图像上设置 Alpha 通道(即,使用 PNG 文件),并使用 GDI 函数 AlphaBlend() 来绘制图形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2020-09-27
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      相关资源
      最近更新 更多