Как нарисовать прозрачное изображение на форме?
Я хочу нарисовать прозрачное изображение на Delphi-форме, но это не работает.
Вот оригинал PNG:
Я загрузил изображение в TImage::
Image1.Transparent := True;
Form1.Color := clWhite;
Form1.TransparentColor := True;
Form1.TransparentColorValue := clWhite;
Приложение:
изображение не полностью прозрачно.
Изображение может быть нарисовано любым элементом управления или просто на холсте.
Я хотел бы использовать BMP-изображения.
может быть, я делаю что-то не так?
пожалуйста, помогите!
3 ответа:
Я нашел решение, которое позволит вам нарисовать BMP-образ с альфа-каналом на форме, используя только Windows API:
const AC_SRC_OVER = 0; AC_SRC_ALPHA = 1; type BLENDFUNCTION = packed record BlendOp, BlendFlags, SourceConstantAlpha, AlphaFormat: byte; end; function WinAlphaBlend(hdcDest: HDC; xoriginDest, yoriginDest, wDest, hDest: integer; hdcSrc: HDC; xoriginSrc, yoriginSrc, wSrc, hSrc: integer; ftn: BLENDFUNCTION): LongBool; stdcall; external 'Msimg32.dll' name 'AlphaBlend'; procedure TForm4.FormClick(Sender: TObject); var hbm: HBITMAP; bm: BITMAP; bf: BLENDFUNCTION; dc: HDC; begin hbm := LoadImage(0, 'C:\Users\Andreas Rejbrand\Skrivbord\RatingCtrl.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if hbm = 0 then RaiseLastOSError; try if GetObject(hbm, sizeof(bm), @bm) = 0 then RaiseLastOSError; dc := CreateCompatibleDC(0); if dc = 0 then RaiseLastOSError; try if SelectObject(dc, hbm) = 0 then RaiseLastOSError; bf.BlendOp := AC_SRC_OVER; bf.BlendFlags := 0; bf.SourceConstantAlpha := 255; bf.AlphaFormat := AC_SRC_ALPHA; if not WinAlphaBlend(Canvas.Handle, 10, 10, bm.bmWidth, bm.bmHeight, dc, 0, 0, bm.bmWidth, bm.bmHeight, bf) then RaiseLastOSError; finally DeleteDC(dc); end; finally DeleteObject(hbm); end; end;
Используя GIMP, я преобразовал PNG-Изображение
Http://privat.rejbrand.se/RatingCtrl.png
Найдено здесь к 32-битному растровому изображению RGBA, найдено Здесь , и результат очень хорошо:
Http://privat.rejbrand.se/gdiblend1.png http://privat.rejbrand.se/gdiblend2.png http://privat.rejbrand.se/gdiblend3.png
Подход
Однако вышеприведенный образ, по-видимому, поврежден. "Правильный" PNG показан ниже:TransparentColorValue
не может работать, потому что он работает только с изображениями, в которых один цвет представляет полную прозрачность. [Кроме того, вы играете с прозрачным цветом формы вместо прозрачного цвета изображения! Вышеописанное изображение PNG должно иметь альфа-канал , поэтому не каждый пиксель либо показан, либо прозрачен-вместо этого каждый пиксель имеет непрозрачность между 0 и 1 (0,37, например). То есть в дополнение к R, G, и B компоненты каждого пикселя, есть "альфа" компонент A.Http://privat.rejbrand.se/RatingCtrl.png
Вы можете попробовать смешать вышеописанную на разных фонах, и вы обнаружите, что тень прекрасно сочетается.
Итак, если у вас есть "правильный" PNG, как нарисовать его на форме? Ну, это будет очень трудно в вашем случае, так как Delphi 7 этого не делает. поддержка PNG изображений. Он поддерживает только BMP изображения, и они обычно не имеют альфа-каналов.