Вот сюда я закачал весь проект целиком (с рисунками) для наложения дельфина, на облака http://alexei-s1.narod.ru/Samples/trans.rar
| Код | type TRGBA = packed record case Byte of 0: (B, G, R, A : Byte); 1: (Acolor : Cardinal); end;
T32bitarr = array[0..32000] of TRGBA; P32bitarr = ^T32bitarr;
procedure TForm1.Button1Click(Sender: TObject); var bmp1, bmp2: TBitMap; Blend: TBlendFunction; i, j : Integer; Line : P32bitarr;
begin bmp1 := TBitMap.Create; bmp2 := TBitMap.Create;
bmp1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Облака.bmp'); // загружаем 1 битмап bmp2.LoadFromFile(ExtractFilePath(Application.ExeName) + 'img.bmp'); // и второй битмап
bmp1.PixelFormat := pf32bit; // переводим оба в 32 бит bmp2.PixelFormat := pf32bit;
for j := 0 to bmp2.Height - 1 do begin Line := bmp2.ScanLine[j]; for i := 0 to bmp2.Width - 1 do if Line[i].Acolor <> 0 //картинку не прозрачной then Line[i].A := 255; end;
Blend.BlendOp := AC_SRC_OVER; Blend.BlendFlags := 0; Blend.SourceConstantAlpha := 255; // прозрачность 50% (0 - 255) Blend.AlphaFormat := AC_SRC_ALPHA; // накладываем битмап 2 на битмап 1 if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp1.Width, bmp1.Height, bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then Canvas.Draw(0, 0, bmp1) // рисуем результат на форме else ShowMessage(IntToStr(GetLastError)); // или код ошибки, если наложить не удалось
bmp1.Free; bmp2.Free; // уничтожаем битмапы end;
|
для рабочего стола все аналогично, вместо облаков будет фрагмент фона (только его уже не нужно никуда загружать, просто передать Handle (канваса десктопа) вместо первой картинки), а второй битмап будет загруженым. Т.о. будет произведено наложение изображений двух контекстов.
Если не получится буду доделывать дальше (а то так не интересно же програмировать, если все будет готово ) |