Delphi 6: Alphablending работает между подизображением и основным холстом, но не между подизображениями - PullRequest
0 голосов
/ 10 октября 2010

У меня есть приложение Delphi 6, в котором у меня есть массив TBitmaps, каждое из которых содержит изображение (подизображение), которое было создано с помощью вызова функции FillRect () с clWhite, чтобы залить Canvas TBitmap белым цветом, после чего следует вызовtoTextOut () для печати некоторого текста на холст растрового изображения.

У меня есть таймер, который обновляет основной Canvas, принадлежащий компоненту TImage, содержимым массива каждый интервал, чтобы отражать изменения, внесенные в координаты X, Y каждого подизображения, поскольку они находятся в движении.Сначала я использую FillRect () с clWhite, чтобы залить основной Canvas белым.Чтобы «напечатать» подизображения, я просто перебираю массив и вызываю Alphablend (), чтобы «напечатать» каждое подизображение на основном Canvas.Каждое вспомогательное изображение имеет координату Z, которая используется для контроля уровня непрозрачности.Подизображения с более высокими координатами Z имеют более низкое значение Alphablend (), чтобы они выглядели более прозрачными, чем те, которые находятся "близко".

Альфа-смешение прекрасно работает с каждым отдельным подизображением и темиболее высокие координаты действительно кажутся более прозрачными, чем те, у которых координаты Z ниже.Тем не менее, у меня проблема с подизображениями, которые перекрываются в пространстве Z.Альфа-смешение между перекрывающимися подизображениями не работает.Вместо этого подизображение «позади» перекрывающегося подизображения перекрывается белым фоном, принадлежащим изображению, которое его перекрывает.Я хочу, чтобы два субизображения правильно перекрывались, чтобы было похоже, что две текстовые строки написаны друг над другом.Вместо этого я вижу текстовую строку спереди, и везде есть белый фон, который составляет Canvas TBitmap, стирая текстовую строку «позади».

Может кто-нибудь сказать мне, почему альфа-смешение работает между каждым отдельным субэлементом?изображение и основной холст, но не между подизображениями?Я говорю между подизображениями только во временном контексте, а не как объекты, потому что все они должны становиться частью основного холста при печати, и я ожидаю, что альфа-смешение будет правильно их смешивать, чего не происходит.

Похоже, что "белый" между подизображениями не обрабатывается так же, как "белый" между подизображением и "белым", принадлежащим основному холсту.

ПОСЛЕДУЮЩАЯ:В ответ на комментарий Андреаса я установил PixelFormat всех TBitmap для подизображений в pf32bit.Теперь альфа-смешение происходит "между" подизображениями.К сожалению, белые области подизображения не рассматриваются как прозрачный цвет.Вместо этого белый фон вспомогательного изображения, находящегося сверху, альфа-смешивается с текстом, принадлежащим нижележащему вспомогательному изображению, создавая светло-серую рамку вокруг вспомогательного изображения сверху, как если бы оно было размыто.Чтобы получить желаемый эффект, мне нужно полностью игнорировать белый фон подизображения.

1 Ответ

1 голос
/ 27 июля 2011

Если вы хотите показать некоторые изображения с 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;
...