0

我有一个 Delphi 6 应用程序,其中我有一个 TBitmaps 数组,每个包含一个图像(子图像),该图像是通过使用 clWhite 调用 FillRect() 以用白色填充 TBitmap 的 Canvas 来创建的,然后调用 toTextOut()将一些文本打印到位图的画布上。

我有一个计时器,它更新属于 TImage 组件的主 Canvas,每个 Interval 都使用数组的内容来反映每个子图像 X、Y 坐标因为它们在运动中所做的更改。首先,我使用带有 clWhite 的 FillRect() 来用白色填充主 Canvas。要“打印”子图像,我只需迭代数组并调用 Alphablend() 将每个子图像“打印”到主画布上。每个子图像都有一个 Z 坐标,用于控制不透明度的级别。Z 坐标较高的子图像具有较低的 Alphablend() 值,以使它们看起来比“近距离”的子图像更透明。

alpha 混合对每个单独的子图像都非常有效,具有较高坐标的子图像确实看起来比具有较低 Z 坐标的子图像更透明。但是,我遇到了在 Z 空间中重叠的子图像的问题。重叠子图像之间的 Alpha 混合似乎不起作用。相反,重叠子图像“后面”的子图像被属于覆盖它的图像的白色背景遮挡。我想要的是两个子图像正确重叠,所以看起来两个文本字符串写在彼此之上。相反,我看到前面的文本字符串和包含它的 TBitmap 画布的白色背景无处不在,消除了它“后面”的文本字符串。

谁能告诉我为什么 alpha 混合在每个单独的子图像和主 Canvas 之间起作用,而不是在子图像之间起作用?我只在时间上下文中说子图像之间而不是作为对象,因为它们在打印时都应该成为主画布的一部分,我希望 alpha-blend 能够正确地混合它们,这不会发生。

就好像子图像之间的“白色”没有被视为与子图像和属于主画布的“白色”之间的“白色”一样。

跟进:针对 Andreas 的评论,我将所有子图像 TBitmap 的 PixelFormat 设置为 pf32bit。现在 alpha 混合发生在子图像“之间”。不幸的是,子图像的白色区域没有被视为透明颜色。相反,顶部子图像的白色背景与属于底层子图像的文本进行 alpha 混合,在顶部子图像周围创建一个浅灰色框架,就好像它被涂抹一样。为了获得我想要的效果,我需要完全忽略子图像的白色背景。

4

1 回答 1

1

如果您想使用 Alphablending 显示一些图像,请尝试使用Graphics32库。在此,您将找到一个组件“ImgView32”。有了这个,您可以轻松地显示具有任何位置和 alpbablend 值的任何类型的位图。您必须使用 TBitmapLayer 并为它们制作图纸。

ImgView1:TImgView32;
a:array of TBitmapLayer;

procedure TForm1.FormCreate(Sender: TObject);
  var i:integer;

  begin
    ImgView1.Layers.Clear;
    SetLength (a,10);
    for i:=0 to High (a) do
      begin
        a[i]:=TBitmapLayer.Create(ImgView1.Layers);
        a[i].Location:=FloatRect(0,0,ImgView1.Width,ImgView1.Height);
        a[i].Scaled:=false;
        a[i].Bitmap.DrawMode:=dmOpaque;
        a[i].Bitmap.MasterAlpha:=255;
      end;
  end;

procedure TForm1.FormDestroy(Sender: TObject);
  begin
    ImgView1.Layers.Clear;
  end;

procedure Form1.DrawTextToLayer(Layer:TBitmapLayer;Text:string;X,Y:integer);
var I:TImage32;

begin
  I:=TImage32.Create(Form1);
  I.Width:=ImgView1.Width;
  I.Height:=ImgView1.Height;
  I.SetupBitmap;
  I.Bitmap.DrawMode:=dmBlend;
  I.Bitmap.Font.Size:=20;
  I.Bitmap.Font.Name:='Arial';
  I.Bitmap.Font.Style:=[fsBold];
  I.Bitmap.RenderText(x,Y,Text,2,clBlack32);
  Layer.Bitmap.Assign(I.Bitmap);
  I.Free        
end;

procedure TForm1.Button1Click(Sender: TObject);
   begin
     DrawTextToLayer(a[0],'Testing 1',10,10);
     DrawTextToLayer(a[1],'Testing 2',20,20);
     a[0].Bitmap.MasterAlpha:=255;
     a[1].Bitmap.MasterAlpha:=100;
   end;
于 2011-07-27T15:06:54.930 回答