Как сделать Альфа прозрачным TImage в Delphi?
На форме у меня два TImages. Тимаж, который находится сверху, должен быть прозрачным, чтобы мы могли видеть, что находится под ним. Как изменить уровень прозрачности Таймажа?
Пример:
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;