代码之家  ›  专栏  ›  技术社区  ›  Robert Oschler Rob

delphi6:Alphablending可以在子图像和主画布之间工作,但不能在子图像之间工作

  •  0
  • Robert Oschler Rob  · 技术社区  · 14 年前

    我有一个计时器来更新主画布,它属于一个TImage组件,数组的内容每间隔一次,以反映每个子图像X,Y坐标的变化,因为它们是运动的。首先,我将FillRect()与clWhite结合使用,以使主画布充满白色。要“打印”子图像,我只需迭代数组并调用Alphablend()将每个子图像“打印”到主画布上。每个子图像都有一个用于控制不透明度级别的Z坐标。Z坐标较高的子图像具有较低的Alphablend()值,使其比“近距离”的子图像更透明。

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

    有人能告诉我为什么alpha混合在每个单独的子图像和主画布之间工作,而不是在子图像之间工作吗?我说的子图像之间只是在一个时间上下文,而不是作为对象,因为他们都应该成为主画布的一部分,因为他们打印,我希望阿尔法混合正确地混合他们,这是没有发生的。

    几乎就好像子图像之间的“白色”没有被视为子图像和主画布上的“白色”之间的“白色”。

    后续:为了回应安德烈亚斯的评论,我将所有子图像TBitmap的像素格式设置为pf32位。现在alpha混合正在子图像之间进行。不幸的是,子图像的白色区域没有被视为透明色。相反,位于顶部的子图像的白色背景与属于基础子图像的文本进行alpha混合,在顶部的子图像周围创建一个浅灰色框架,就好像它被涂抹了一样。为了得到我想要的效果,我需要完全忽略子图像的白色背景。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Fenistil    13 年前

    如果你想用Alphablending显示一些图像,试着使用 Graphics32 图书馆。 在这里,您将发现一个组件“ImgView32”。有了这个,你可以很容易地显示任何位置和值的位图。你必须使用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;