0

私は Delphi 6 アプリケーションを持っており、TBitmap の Canvas を白で塗りつぶすために clWhite を使用して FillRect() を呼び出し、続いて toTextOut() を呼び出すことによって作成されたイメージ (サブイメージ) を含む TBitmaps の配列があります。ビットマップのキャンバスにテキストを印刷します。

TImage コンポーネントに属するメイン Canvas を更新するタイマーがあり、各サブイメージ X、Y 座標が動いているために加えられた変更を反映するために、Interval ごとに配列の内容が反映されます。まず、clWhite で FillRect() を使用して、メインの Canvas を白で塗りつぶします。サブイメージを「印刷」するには、配列を反復処理し、Alphablend() を呼び出して、各サブイメージをメイン Canvas に「印刷」します。各サブイメージには、不透明度の制御に使用される Z 座標があります。Z 座標が高いサブイメージは、Alphablend() の値が低くなり、「クローズ アップ」のものよりも透明に見えます。

アルファブレンディングは、個々のサブイメージでうまく機能し、座標が高いものは、Z 座標が低いものよりも透明に見えます。ただし、Z 空間でオーバーラップするサブイメージに問題があります。重なり合うサブイメージ間のアルファ ブレンディングは機能していないようです。代わりに、オーバーラップするサブイメージの「後ろ」にあるサブイメージは、その上にあるイメージに属する白い背景によって遮られます。私が望むのは、2 つのサブイメージを適切に重ね合わせて、2 つのテキスト文字列が互いに重なって表示されるようにすることです。代わりに、前面のテキスト文字列が表示され、TBitmap の Canvas を構成する白い背景がどこにでも存在し、その「後ろ」のテキスト文字列が消去されます。

個々のサブイメージとメイン キャンバスの間でアルファ ブレンディングが機能しているのに、サブイメージ間では機能していない理由を誰か教えてもらえますか? オブジェクトとしてではなく一時的なコンテキストでのみサブイメージ間で言うのは、サブイメージが印刷されるときにすべてメイン キャンバスの一部になる必要があり、アルファ ブレンドがそれらを適切にブレンドすることを期待しているからです。

サブイメージ間の「白」が、サブイメージとメイン Canvas に属する「白」との間の「白」と同じように扱われていないかのようです。

フォローアップ: Andreas のコメントに応えて、すべてのサブイメージ TBitmap の PixelFormat を pf32bit に設定しました。現在、サブイメージの「間」でアルファブレンディングが行われています。残念ながら、サブイメージの白い部分は透明色として扱われていません。代わりに、上にあるサブイメージの白い背景が下にあるサブイメージに属するテキストとアルファブレンドされ、上にあるサブイメージの周りに薄い灰色のフレームが作成されます。必要な効果を得るには、サブイメージの白い背景を完全に無視する必要があります。

4

1 に答える 1

1

アルファブレンディングで画像を表示したい場合は、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 に答える