Как сделать Альфа прозрачным TImage в Delphi?


На форме у меня два TImages. Тимаж, который находится сверху, должен быть прозрачным, чтобы мы могли видеть, что находится под ним. Как изменить уровень прозрачности Таймажа?

Пример: Введите описание изображения здесь

2 4

2 ответа:

Обычным способом будет рисование всех графических объектов на одном целевом холсте (который может быть растровым изображением Таймажа), но даже с большим количеством перекрывающихся Таймажей это можно сделать. Имейте в виду, что вы не можете перекрывать TWinControls.
Поскольку 32-битное растровое изображение поддерживает прозрачность, это может быть достигнуто путем преобразования содержащейся графики в растровое изображение (если это необходимо).
При установке Alphaformat: = afDefined растровое изображение будет отображаться с информацией о прозрачности из alphachannel.
Нам нужна копия растровое изображение с момента установки AlphaFormat позволит нам избавиться от пиксельной информации.
С помощью scanlines пиксельная информация из копии может быть передана в пункт назначения, Альфа-канал устанавливается в нужное значение.

Реализация "огонь и забвение" может выглядеть следующим образом:

type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY [0 .. 0] OF TRGBQuad;

procedure SetImageAlpha(Image:TImage; Alpha: Byte);
var
  pscanLine32,pscanLine32_src: pRGBQuadArray;
  nScanLineCount, nPixelCount : Integer;
  BMP1,BMP2:TBitMap;
  WasBitMap:Boolean;
begin
  if assigned(Image.Picture) then
    begin
       // check if another graphictype than an bitmap is assigned
       // don't check Assigned(Image.Picture.Bitmap) which will return always true
       // since a bitmap is created if needed and the graphic will be discared   
       WasBitMap := Not Assigned(Image.Picture.Graphic);
       if not WasBitMap then
          begin   // let's create a new bitmap from the graphic
            BMP1 := TBitMap.Create;
            BMP1.Assign(Image.Picture.Graphic);
          end
       else BMP1 := Image.Picture.Bitmap;  // take the bitmap

       BMP1.PixelFormat := pf32Bit;

       // we need a copy since setting Alphaformat:= afDefined will clear the Bitmap
       BMP2 := TBitMap.Create;
       BMP2.Assign(BMP1);

       BMP1.Alphaformat := afDefined;

    end;
    for nScanLineCount := 0 to BMP1.Height - 1 do
    begin
      pscanLine32 := BMP1.Scanline[nScanLineCount];
      pscanLine32_src := BMP2.ScanLine[nScanLineCount];
      for nPixelCount := 0 to BMP1.Width - 1 do
        begin
          pscanLine32[nPixelCount].rgbReserved := Alpha;
          pscanLine32[nPixelCount].rgbBlue := pscanLine32_src[nPixelCount].rgbBlue;
          pscanLine32[nPixelCount].rgbRed  := pscanLine32_src[nPixelCount].rgbRed;
          pscanLine32[nPixelCount].rgbGreen:= pscanLine32_src[nPixelCount].rgbGreen;
        end;
    end;
    If not WasBitMap then
      begin  // assign and free Bitmap if we had to create it
      Image.Picture.Assign(BMP1);
      BMP1.Free;
      end;
    BMP2.Free; // free the copy
end;



procedure TForm3.Button1Click(Sender: TObject);
begin  // call for the example image
  SetImageAlpha(Image1,200);
  SetImageAlpha(Image2,128);
  SetImageAlpha(Image3,80);

end;

Введите описание изображения здесь

TImage сам по себе (и любой другой элемент управления пользовательского интерфейса, если на то пошло) не может быть альфа-смешан поверх других элементов управления. Однако вы можете отобразить Альфа-смешанное GIF-изображение внутри TImage, используя класс TGIFImage.